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

时间:2009-08-14 17:28:59

标签: python regex

我想删除首字母缩略词中的点,但不删除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 个答案:

答案 0 :(得分:5)

如果您的数据总是这样格式化,那么为什么不通过拆分空间将数据拆分为3个部分。

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

答案 1 :(得分:2)

我建议你将字符串拆分为'@'(或任何有意义的字符),在第一部分进行替换,然后将字符串重新组合在一起。我认为这将比复杂的正则表达式更好地显示代码的意图。这样的事情,也许是:

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

答案 2 :(得分:2)

您可以简单地删除前面没有两个[a-z]字母(或更多)的DOTS:

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

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

name.i@foo.bar

您可以通过执行以下操作来解决此问题:

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

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

答案 3 :(得分:1)

以下对我有用(感谢Bart的回答):

re.sub('\.(?!(\S[^. ])|\d)', '', s)

如果它是单词或首字母缩略词中的第一个字符,则不会删除该点。

答案 4 :(得分:1)

非正则表达方式:

>>> S = 'a.b.c. test@test.com http://www.test.com'
>>> ' '.join(w if '@' in w or ':' in w else w.replace('.', '') for w in S.split())
'abc test@test.com http://www.test.com'

(但需要分隔的空格 - 所以如果你有一些没有空格的逗号,可能会错过一些。)

答案 5 :(得分:0)

不如简单re.sub()那么优雅,但请尝试以下方法:

import re

s='a.b.c. test@test.com http://www.test.com'
m=re.search('(.*?)(([a-zA-Z]\.){2,})(.*)', s)

if m:
    replacement=''.join(m.group(2).split('.'))
    s=m.group(1)+replacement+m.group(4)

print s

它假设每个字符串的首字母缩写不超过一个,但您可以反复运行它。