考虑以下Python代码:影响?在正则表达式字符串
>>> re.search(r'.*(99)', 'aa99bb').groups()
('99',)
>>> re.search(r'.*(99)?', 'aa99bb').groups()
(None,)
我不明白为什么我没有在第二个例子赶上99。
考虑以下Python代码:影响?在正则表达式字符串
>>> re.search(r'.*(99)', 'aa99bb').groups()
('99',)
>>> re.search(r'.*(99)?', 'aa99bb').groups()
(None,)
我不明白为什么我没有在第二个例子赶上99。
这是因为.*
首先匹配整个字符串。此时,不可能再匹配99
,并且由于该组是可选的,所以正则表达式引擎会停止,因为它找到了成功的匹配。
如果另一方面该组是强制性的,则正则表达式引擎必须回溯到.*
。
比较从RegexBuddy以下调试会话(由.*
匹配字符串的一部分以黄色突出显示,通过(99)
蓝色匹配的部分):
.*(99)
:
.*(99)?
:
根据您的需要,一个不错的选择可能是[^9]*(99)?
。 没有回溯,而是匹配除9之外的任何其他值,然后是可选值99.如果要在99之前忽略9,则不起作用。
>>> re.search(r'[^9]*(99)?', 'aa99bb').groups()
('99',)
>>> re.search(r'[^9]*(99)?', 'aa9x99bb').groups()
(None,)
+1不错的使用RB屏幕捕获! – ridgerunner 2011-03-19 16:12:47