python re string替换较少匹配的函数

时间:2012-03-02 15:14:46

标签: python regex

我使用Python的re模块替换子字符串,例如:

>>> import re
>>> re.sub(r"a.*b","ab","acbacbacb")
'ab'

这会将.*cbacbac匹配,但我希望它与c匹配三次,以便输出为ababab

有人能告诉我怎么做吗?

4 个答案:

答案 0 :(得分:2)

最简单的解决方案是使用懒惰(非贪婪)*?运算符:

>>> re.sub(r"a.*?b","ab","acbacbacb")
'ababab'

然而,这可能会对性能产生影响。由于这个正则表达式的结构,你也可以使用等价的

re.sub(r"a[^b]*b","ab","acbacbacb")

可以表现得更好,具体取决于优化程序的优秀程度。

如果您对.*部分的结构有更多的先验知识,那么您应该更加明确。比如说,您已经知道ab之间只有c,您可以这样做

re.sub(r"ac*b","ab","acbacbacb")

答案 1 :(得分:1)

默认情况下,正则表达式是贪婪的。使用.*?

>>> import re
>>> re.sub(r"a.*?b","ab","acbacbacb")
'ababab'
>>> 

http://docs.python.org/library/re.html

  

*+?限定符都是贪婪的;他们匹配得那么多   文本尽可能。有时这种行为是不可取的;如果有   <.*>'<H1>title</H1>'匹配,它将与整个匹配   字符串,而不仅仅是'<H1>'。在限定符之后添加?   以非贪婪或极简的方式进行比赛;少数人物   尽可能匹配。在前一个表达式中使用.*?将   仅匹配'<H1>'

答案 2 :(得分:0)

使用非贪婪的比赛:

re.sub(r"a.*?b","ab","acbacbacb")
'ababab'

来自http://docs.python.org/library/re.html

  

&#39; *&#39;,&#39; +&#39;,&#39;?&#39;资格赛都是贪心的;他们匹配得那么多   文本尽可能。有时这种行为是不可取的。 [...]添加   &#39;&#39;在限定符之后使它在非贪婪或者执行匹配   最小的时尚;尽可能少的字符将被匹配。

答案 3 :(得分:0)

re.sub(r"a.b","ab","acbacbacb")
'ababab'