我使用Python的re
模块替换子字符串,例如:
>>> import re
>>> re.sub(r"a.*b","ab","acbacbacb")
'ab'
这会将.*
与cbacbac
匹配,但我希望它与c
匹配三次,以便输出为ababab
。
有人能告诉我怎么做吗?
答案 0 :(得分:2)
最简单的解决方案是使用懒惰(非贪婪)*?
运算符:
>>> re.sub(r"a.*?b","ab","acbacbacb")
'ababab'
然而,这可能会对性能产生影响。由于这个正则表达式的结构,你也可以使用等价的
re.sub(r"a[^b]*b","ab","acbacbacb")
可以表现得更好,具体取决于优化程序的优秀程度。
如果您对.*
部分的结构有更多的先验知识,那么您应该更加明确。比如说,您已经知道a
和b
之间只有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'