在首字母缩略词而不是域名中删除点的正则表达式是什么?

2024-06-12 09:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想删除首字母缩略词中的点,而不是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'

似乎要使上面的regex工作,我需要将regex更改为

(?:\s|\A|\G).{1}\.

但是python中没有匹配结束标记(\G)。

编辑:正如我在评论中提到的,字符串没有特定的格式。这些字符串包含非正式的人工对话,因此可能包含零个、一个或多个缩写或域名。如果可以避免编写“真正的”解析器,我可以犯一些错误。


Tags: lambda字符串testrecomhttpabwww
3条回答

如果数据的格式总是这样的,那么为什么不通过在空格上拆分将数据分成3部分呢。

然后,从第一个元素中删除句点并使用join重新合并这些部分是非常简单的。

我建议您在“@”(或任何有意义的字符)处拆分字符串,在第一部分进行替换,然后将字符串放回一起。我认为这将比复杂的regexp更好地显示代码的意图。可能是这样的:

string='a.b.c. test@test.com http://www.test.com'
left, rest = string.split("@",1)
left = left.replace(".","")
result="%s@%s" % (left, rest)

您可以简单地删除前面没有两个(或更多)字母的点:

\.(?![a-zA-Z]{2})

但这当然也会删除以下地址的第一个点:

name.i@foo.bar邮箱

你可以通过这样做来解决这个问题:

\.(?![a-zA-Z]{2}|[^\s@]*+@)

但我相信会有更多这样的角落案件。

相关问题 更多 >