Python 为什么不是';我的可选组不贪婪吗/(5)?.*/

Python 为什么不是';我的可选组不贪婪吗/(5)?.*/,python,regex,Python,Regex,我认为,即使一个组是可选的?,在进入正则表达式的下一部分之前,它仍然是贪婪的,并且会消耗字符(如果可以的话) 当我指定简化的正则表达式(5).*与(5).*(第1组不是可选的)时,我在python 2.7.6中看到了不同的行为,尽管我希望使用完全相同的字符串来实现相同的行为: >>> import re >>> s = 'before [5.5s] after' >>> r = re.compile(r'(5)?.*') >>&g

我认为,即使一个组是可选的
,在进入正则表达式的下一部分之前,它仍然是贪婪的,并且会消耗字符(如果可以的话)

当我指定简化的正则表达式
(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


注意:我需要为什么的理论,因为任何解决这个特定正则表达式的尝试都不会帮助我。这是一个很好的例子。我有一个更复杂的正则表达式,我真的希望填补我的知识空白,即为什么可选组不像我想的那样贪婪。

第一个例子:

  • 正则表达式与整个字符串
    s
    匹配
  • 因此,
    s
    的第一个字符是“b”,它与
    (5)
    匹配,而
    不会导致匹配。但是,这不是问题,因为
    (5)?
    是模式的可选部分,因此正则表达式引擎将其匹配零次,并继续推进模式中的当前位置
  • 字符串的其余部分与模式的其余部分匹配,因此整个字符串是匹配的。但是,组
    (5)
    本身与任何内容都不匹配,因此您在第一个示例中看到了
    None
第二个示例:

  • 5
    不再是可选的,因此潜在匹配字符串的第一个字符必须是“5”。因此,潜在匹配从“before[”之后的“5”开始
  • 为了匹配,剩余的字符串必须匹配剩余的模式
    *
    ,它会这样做

注意,一般来说,.

人们永远不会停止问这样的问题……因为
(5)?
可以匹配空字符串,并且由于正则表达式引擎从左到右解析字符串,所以
(5)?
匹配字符串的开头,
*
匹配行的其余部分。然而,
重新编译('(.*)(.*))。搜索('abc').groups()
产生
('abc','')
。你知道为什么吗?
搜索从字符串的开头开始匹配。如果它有匹配项(如在这些情况下),则不考虑其他开始索引。@RossRogers:当你称呼某人时,使用
@
+用户名。
(.*)(.*))
很简单:第一个
*
抓住了整个字符串,第二个没有其他东西可以抓住。阅读关于回溯和量词的文章。这篇文章很有趣,但标题是最糟糕的。@CasimiritHippolyte我道歉。;)哦,这是你的,对不起。我的意思是,这个标题可能会导致贪婪的量词必须避免(当它们比懒惰的量词快得多时)。你应该写一篇关于避免懒惰量词的方法的文章!一般来说,这不是关于贪婪的量词,特别是关于
*