2011-03-19 29 views
4

考虑以下Python代码:影响?在正则表达式字符串

>>> re.search(r'.*(99)', 'aa99bb').groups() 
('99',) 
>>> re.search(r'.*(99)?', 'aa99bb').groups() 
(None,) 

我不明白为什么我没有在第二个例子赶上99。

回答

11

这是因为.*首先匹配整个字符串。此时,不可能再匹配99,并且由于该组是可选的,所以正则表达式引擎会停止,因为它找到了成功的匹配。

如果另一方面该组是强制性的,则正则表达式引擎必须回溯到.*

比较从RegexBuddy以下调试会话(由.*匹配字符串的一部分以黄色突出显示,通过(99)蓝色匹配的部分):

.*(99)

enter image description here


.*(99)?

enter image description here

+0

+1不错的使用RB屏幕捕获! – ridgerunner 2011-03-19 16:12:47

0

根据您的需要,一个不错的选择可能是[^9]*(99)?。 没有回溯,而是匹配除9之外的任何其他值,然后是可选值99.如果要在99之前忽略9,则不起作用。

>>> re.search(r'[^9]*(99)?', 'aa99bb').groups() 
('99',) 
>>> re.search(r'[^9]*(99)?', 'aa9x99bb').groups() 
(None,)