去除缩写中的点但保留域名中的点的正则表达式是什么?
我想在一个Python字符串中去掉缩写里的点,但不想去掉域名里的点。比如,我希望这个字符串
'a.b.c. test@test.com http://www.test.com'
变成
'abc test@test.com http://www.test.com'
我目前写的正则表达式是
re.sub('(?:\s|\A).{1}\.',lambda s: s.group()[0:2], s)
结果是
'ab.c. test@test.com http://www.test.com'
看起来要让上面的正则表达式有效,我需要把它改成
(?:\s|\A|\G).{1}\.
但在Python中没有匹配结束标记(\G)。
补充说明:正如我在评论中提到的,这些字符串没有特定的格式。它们包含非正式的人类对话,可能有零个、一个或多个缩写或域名。如果能让我省去写一个“真正的”解析器,出现一些小错误我也是可以接受的。
6 个回答
2
你可以简单地去掉那些前面没有两个或更多小写字母[a-z]的点(DOTS):
\.(?![a-zA-Z]{2})
不过这样做当然也会把下面这个地址的第一个点去掉:
name.i@foo.bar
你可以通过这样做来解决这个问题:
\.(?![a-zA-Z]{2}|[^\s@]*+@)
但我相信还会有很多类似的特殊情况。
5
如果你的数据总是这样格式化,那为什么不通过空格把数据分成三部分呢?
然后,去掉第一部分中的句号就很简单了,最后用连接的方法把这几部分再合并起来。
1
以下内容对我有效(感谢Bart的回答):
re.sub('\.(?!(\S[^. ])|\d)', '', s)
这个方法不会去掉单词或缩写开头的点。