Python 什么';“删除首字母缩写中的点而不是域名中的点的正则表达式是什么?”?
我想删除缩写词中的点,但不要删除python字符串中域名中的点。例如 我想要绳子Python 什么';“删除首字母缩写中的点而不是域名中的点的正则表达式是什么?”?,python,regex,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'
'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)
编辑:正如我在评论中提到的,字符串没有特定的格式。这些字符串包含非正式的人类对话,因此可能包含零个、一个或多个首字母缩略词或域名。如果可以避免编写“真正”的解析器,那么我认为一些错误是可以的。我建议您将字符串拆分为“@”(或任何有意义的字符),对第一部分进行替换,然后将字符串重新组合在一起。我认为这将比复杂的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)
我建议您将字符串拆分为“@”(或任何有意义的字符),对第一部分进行替换,然后将字符串重新组合在一起。我认为这将比复杂的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-z]字母(或更多)的点:
\.(?![a-zA-Z]{2})
但这当然也会删除以下地址中的第一个点:
名字。i@foo.bar
您可以通过执行以下操作来解决此问题:
\.(?![a-zA-Z]{2}|[^\s@]*+@)
但我相信还会有更多这样的角落案例。你可以简单地删除前面没有两个[a-z]字母(或更多)的点:
\.(?![a-zA-Z]{2})
但这当然也会删除以下地址中的第一个点:
名字。i@foo.bar
您可以通过执行以下操作来解决此问题:
\.(?![a-zA-Z]{2}|[^\s@]*+@)
但是我相信还会有更多这样的角落案例。如果您的数据总是这样格式化,那么为什么不通过在空格上拆分将数据拆分为3部分呢
那么,从第一个元素中删除句点并使用join重新合并部分就非常简单了。如果您的数据总是这样格式化,那么为什么不通过在空格上拆分将数据拆分为3个部分呢
然后,从第一个元素中删除句点并使用join重新合并部分就非常简单了。没有简单的
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
它假定每个字符串不超过一个首字母缩略词,但您始终可以重复运行它。不像简单的
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
它假设每个字符串不超过一个首字母缩略词,但您始终可以重复运行它。以下内容对我有效(感谢巴特的回答):
如果圆点是单词或首字母缩略词中的第一个字符,则不会删除该圆点 以下内容对我很有用(感谢巴特的回答): 如果圆点是单词或首字母缩略词中的第一个字符,则不会删除该圆点 非正则表达式方式:
>>> 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'
(不过,需要拆分空格-因此,如果有逗号之类的字符,但没有空格,则可能会遗漏一些。)非正则表达式方式:
>>> 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'
(不过,需要拆分空格-因此,如果有逗号之类的没有空格的东西,可能会遗漏一些。)IMHO正则表达式不是解决问题的合适工具。这可能会导致代码过于复杂。我将采用更传统的方法,使用混合regexs和python代码将字符串拆分为其组件(普通文本、首字母缩略词等),并单独处理这些部分。我可能应该提到,我正在使用它作为一系列其他正则表达式的一部分来规范表示非正式人类对话的字符串序列。我可以容忍一些错误,如果这样可以避免我进行更彻底的分析。您需要更好地指定问题。您的数据总是在三个空间分隔的部分中,而您只想影响第一部分吗?或者您需要将其应用于任意文本吗?如果是后者,您将如何定义首字母缩略词?只有一个字母?如果是这样的话,你预计会发生什么?或者你想删除嵌入的句点,除非你知道它是域名的一部分?但这仅仅回避了一个问题:它什么时候是域名的一部分:在@或http://之后?ssh:或其他URL方案呢?一旦定义好,任何一个都将是一个简单的正则表达式。我将首字母缩略词定义为一系列单字母字符后跟一个点。这可能会导致代码过于复杂。我将采用更传统的方法,使用混合regexs和python代码将字符串拆分为其组件(普通文本、首字母缩略词等),并单独处理这些部分。我可能应该提到,我正在使用它作为一系列其他正则表达式的一部分来规范表示非正式人类对话的字符串序列。我可以容忍一些错误,如果这样可以避免我进行更彻底的分析。您需要更好地指定问题。您的数据总是在三个空间分隔的部分中,而您只想影响第一部分吗?或者您需要将其应用于任意文本吗?如果是后者,您将如何定义首字母缩略词?只有一个字母?如果是这样的话,你预计会发生什么?或者你想删除嵌入的句点,除非你知道它是域名的一部分?但这仅仅回避了一个问题:它什么时候是域名的一部分:在@或http://之后?ssh:或其他URL方案呢?一旦定义好,任何一个都将是一个简单的正则表达式。我把首字母缩写词定义为一系列单字母字符,后跟一个点。它的格式并不总是这样。我将在非正式的人际对话中使用它作为一种暗示