我正试着拥抱Python模块。然而,我很难理解为什么python3认为findall()有两个匹配。
>>>import re
>>>re.match('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
<_sre.SRE_Match object; span=(0, 7), match='123-345'>
>>>re.search('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
<_sre.SRE_Match object; span=(0, 7), match='123-345'>
>>>re.findall('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
['123-345', '0987']我认为findall()调用与0987不匹配?我遗漏了什么?
发布于 2015-02-02 15:07:43
>>>re.findall('\d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}', '123-345--0987')
['123-345', '0987']为什么?
因为\d{1,3}匹配的数字范围从1到3贪婪地。因为它是贪婪的,所以它试图匹配最大可能的东西,因此,123-345被匹配,而下面的--由于双破折号而失败。然后尝试从剩下的字符串中找到一个匹配项,因此0987得到了匹配-- "09" matched by \d{1,3}、"8" matched by \d{1,3}和"7" matched by \d{1,4}。
123-345--0987 \d{1,3}起初,\d{1,3}试图贪婪地匹配这三个数字。如果没有找到三位数,则尝试匹配2位数,然后是一位数。由于贪婪中的上述模式,它匹配123、345和098。
123-345--0987 \d{1,3}[-\s]?然后尝试匹配以下可选的-或空格。所以123-,345-,098被匹配了。
123-345--0987 \d{1,3}[-\s]?\d{1,3}它匹配123-345和0987,在第二个匹配和额外的7,因为您定义了\d{1,3}匹配的数字范围从1到3(回溯发生在这里)。
123-345--0987 \d{1,3}[-\s]?\d{1,3}[-\s]?[-\s]?匹配一个可选的空格字符或破折号。现在,这匹配了123-345-和0987,保持了原样。因为这个模式是可选的。
123-345--0987 \d{1,3}[-\s]?\d{1,3}[-\s]?\d{1,4}为了提供匹配,所有贪婪匹配的123-345都后退一步,而123-345中的5由最后一个\d{1,4}模式匹配。注意,它会将-放到以前匹配的123-345-中,因为5-后面没有数字。现在开始第二场比赛( 0987 ).我们已经得到了一个匹配,但是为了提供一个匹配,\d{1,4}匹配最后一个7,以及[-\s]?\d{1,4}匹配8之前存在的\d{1,3}模式。回溯发生在这里。
https://stackoverflow.com/questions/28280562
复制相似问题