去除缩写中的点但保留域名中的点的正则表达式是什么?

1 投票
6 回答
7311 浏览
提问于 2025-04-15 13:36

我想在一个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)

这个方法不会去掉单词或缩写开头的点。

撰写回答