我想删除首字母缩略词中的点,但不删除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)。
编辑:正如我在评论中提到的,字符串没有特定的格式。这些字符串包含非正式的人工对话,因此可能包含零个,一个或多个首字母缩略词或域名。如果它能使我免于编写“真正的”解析器,那么我可以使用一些错误。
答案 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
它假设每个字符串的首字母缩写不超过一个,但您可以反复运行它。