使用正则表达式替换重叠的子模式

时间:2013-03-08 19:32:45

标签: python regex

我有以下正则表达式替换:

input=re.sub( r"([a-zA-Z0-9])\s+([a-zA-Z0-9])" , r"\1*\2" , input )

我在字符串"3 a 5 b"上使用正则表达式。

我回来了"3*a 5*b"

我在想我应该回来"3*a*5*b"

所以我的正则表达式替换在某种程度上相互干扰。

除了正则表达式的迭代运行之外,我能做些什么来获得我想要的结果?

2 个答案:

答案 0 :(得分:18)

使用lookahead assertion(?=...),以免吃掉第二种模式:

In [33]: re.sub( r"([a-zA-Z0-9])\s+(?=[a-zA-Z0-9])" , r"\1*" , '3 a 5 b')
Out[33]: '3*a*5*b'

In [32]: re.sub( r"([a-zA-Z0-9])\s+(?=[a-zA-Z0-9])" , r"\1*" , "3 /a 5! b" )
Out[32]: '3 /a*5! b'

答案 1 :(得分:1)

使用Python时,正则表达式并不总是最佳工具。对于上面描述的情况,Python提供了一种更简单,更易读,更易于维护的方法:

>>> s = "3 a 5 b"
>>> '*'.join(s.split())
'3*a*5*b'