我的Python版本是2.7.6
爲什麼re.findall('(ab)+','abab')返回['ab'] =與此同時re.findall('(ab)+?','abab')返回['ab','ab' ]?
我知道+?
是+
的非貪婪版本。
,以便re.findall('(ab)+?', 'abab')
儘可能少地匹配ab
。
結果['ab', 'ab']
因此是有意義的。
但是當談到貪婪版本匹配re.findall('(ab)+', 'abab')
時,它讓我困惑。
我認爲貪婪的版本應該儘可能匹配ab
。
因此我得到['abab']
。
但我得到了['ab']
!
在re.findall()的幫助信息,它說:
Return a list of all non-overlapping matches in the string.
If one or more groups are present in the pattern, return a
list of groups; this will be a list of tuples if the pattern
has more than one group.
Empty matches are included in the result.
這裏我有兩個組,爲整個RE默認group0
,我指定(ab)
爲group1
。
所以我做了如下調查:
In [21]: ng = re.search('(ab)+?', 'abab')
In [22]: g = re.search('(ab)+', 'abab')
In [23]: ng.group(0)
Out[23]: 'ab'
In [24]: ng.group(1)
Out[24]: 'ab'
In [25]: g.group(0)
Out[25]: 'abab'
In [26]: g.group(1)
Out[26]: 'ab'
這是毋庸置疑的,re
模塊將匹配'abab'
爲GROUP0和'ab'
作爲組1的貪婪搜索。
但是爲什麼我在findall()
操作時得到了['ab']
而不是['abab', 'ab']
?
因爲'abab'
包含ab
所以它們重疊,並且findall()
只返回在這種情況下的最後一場比賽?
帶着這樣的疑問,我做了如下試驗:
In [30]: g = re.findall('[A-z](ab)+', 'ababdab')
In [31]: g
Out[31]: ['ab', 'ab']
In [32]: dg = re.search('[A-z](ab)+', 'ababdab')
In [33]: dg.groups()
Out[33]: ('ab',)
In [34]: dg.group()
Out[34]: 'bab'
現在,我現在是完全出我的腦海。
findall如何在這裏工作?
爲什麼?
**警告:不要在正則表達式中使用範圍'[Az]'**它符合所有的ASCII字母,但它也匹配恰好位於'Z'和'a之間的幾個標點符號'數字。 – 2015-04-03 12:33:56