2009-08-14 46 views
1

我想删除首字母缩写词中的点,但不要删除python字符串中的域名。例如, 我希望字符串删除首字母缩写词的正则表达式的正则表达式是什么?

'a.b.c. [email protected] http://www.test.com' 

成为

'abc [email protected] http://www.test.com' 

我做的最接近的正则表达式到目前为止

re.sub('(?:\s|\A).{1}\.',lambda s: s.group()[0:2], s) 

其结果

'ab.c. [email protected] http://www.test.com' 

它似乎f或上述正则表达式来工作,我需要正则表达式更改为

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

但不存在匹配标记(\ G)在Python结束。

编辑:正如我在我的评论中提到的,字符串没有特定的格式。这些字符串包含非正式的人类对话,因此可能包含零个,一个或几个缩略词或域名。如果能够让我免于编码一个“真正的”解析器,那么我的一些错误就没有问题了。

+4

恕我直言,一个正则表达式是不您的问题的正确工具。这可能是可能的,但会导致代码过于复杂。我会采用更传统的方法,并使用混合正则表达式和Python代码将字符串拆分为其组件(普通文本,缩略词,...),并单独处理这些部分。更详细但也更易于维护。 – sebasgo 2009-08-14 17:36:39

+0

我可能应该提到我将它用作一系列其他正则表达式的一部分,用于规范表示非正式人类对话的字符串序列。我可以容忍一些错误,如果这会让我无法进行更彻底的解析。 – ianalis 2009-08-14 21:27:52

+1

您需要更好地指定问题。你的数据总是在三个空间分开的部分,你只想影响第一部分?或者您是否需要将此应用于任意文本?如果后者,你会如何定义一个首字母缩略词?只有单个字母?如果是这样,那么您期望http://a.b.example.com会发生什么?或者,除非你知道它是域名的一部分,否则你想删除嵌入的时段?但是,这只会引出一个问题:它是什么时候成为域名的一部分:After @ or http://?那么ssh:或其他URL方案呢?一旦定义,任何这些将是一个简单的正则表达式。 – MtnViewMark 2009-08-14 21:46:07

回答

1

对我下面的工作(与感谢Bart他的回答):

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

如果是在一个单词或缩写的第一个字符这不会删除一个点。

2

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

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

你可以简单地删除没有这两个[AZ]字母(或更多)DOTS在他们前面:

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

但是,当然,这也将删除第一个点从以下地址:

[email protected]

你可以解决这个问题做:

\.(?![a-zA-Z]{2}|[^\[email protected]]*[email protected]) 

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

+0

感谢您的建议。这是我答案的基础。它确实出现在我的脑海之中,但我错误地不去追求它。 – ianalis 2009-08-14 21:39:45

5

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

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

+1

它并不总是像这样格式化。我将在我新增加的评论中提到的非正式人类对话中使用它。 – ianalis 2009-08-14 21:29:58

0

不优雅的简单re.sub(),但试试这个:

import re 

s='a.b.c. [email protected] 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 

它假定有每串不超过一个缩写,但你总是反复运行它。

1

非正则表达式的方法:

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

(需要空间分割上,虽然 - 所以,如果你有这样的事情逗号,没有空格,则可能会错过一些。)

相关问题