我认为即使一个组是可选的?
,它仍然是贪婪的并消耗字符,如果它可以,然后转到正则表达式的下一部分。
当我指定简化的正则表达式(5)?.*
与(5).*
(组1 不可选)时,我在python 2.7.6中看到了不同的行为,即使我希望使用完全相同的字符串的相同行为:
>>> import re
>>> s = 'before [5.5s] after'
>>> r = re.compile(r'(5)?.*')
>>> print r.search(s).groups()
(None,)
>>> r2 = re.compile(r'(5).*')
>>> print r2.search(s).groups()
('5',)
我没有得到什么?为什么第一个正则表达式r
没有吸5?
注意:我需要为什么的理论,因为任何解决这个特定正则表达式的尝试都无法帮助我。这是SSCCE。我有一个更复杂的正则表达式,我真的希望填补我的知识差距为什么可选组不像我想象的那样贪婪。
答案 0 :(得分:4)
第一个例子:
s
匹配。s
的第一个字符是" b" ,与(5)?
匹配,但不会产生任何结果在一场比赛中。但是,这不是问题,因为(5)?
是模式的可选部分,因此正则表达式引擎将其匹配零次并继续推进模式中的当前位置。 (5)
本身并不匹配任何内容,因此您在第一个示例中看到None
。第二个例子:
5
不再是可选的,因此潜在匹配字符串的第一个字符必须是" 5" 。因此,潜在匹配从" 5" 开始"之后[" 。.*
。请注意,一般情况下,using the greedy .*
is almost never what you want。