考虑以下Python代码:
>>> re.search(r'.*(99)', 'aa99bb').groups()
('99',)
>>> re.search(r'.*(99)?', 'aa99bb').groups()
(None,)
我不明白为什么我在第二个例子中没有抓到99。
答案 0 :(得分:11)
这是因为.*
首先匹配整个字符串。此时,无法再匹配99
,并且由于该组是可选的,因此正则表达式引擎会停止,因为它已找到成功匹配。
另一方面,如果该组是强制性的,则正则表达式引擎必须回溯到.*
。
比较RegexBuddy中的以下调试会话(由.*
匹配的字符串部分以黄色突出显示,部分由(99)
以蓝色突出显示:
.*(99)
:
.*(99)?
:
答案 1 :(得分:0)
根据您的需要,一个不错的选择可能是[^9]*(99)?
。
没有回溯,而是匹配9以外的任何东西,然后是可选的99.如果你想在99之前忽略9s,则不起作用。
>>> re.search(r'[^9]*(99)?', 'aa99bb').groups()
('99',)
>>> re.search(r'[^9]*(99)?', 'aa9x99bb').groups()
(None,)