影响?在正则表达式字符串中

时间:2011-03-19 09:16:51

标签: python regex

考虑以下Python代码:

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

我不明白为什么我在第二个例子中没有抓到99。

2 个答案:

答案 0 :(得分:11)

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

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

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

.*(99)

enter image description here


.*(99)?

enter image description here

答案 1 :(得分:0)

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

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