2010-08-25 89 views
0

我發現findall(r'(ab)+', "ababababab")只能匹配[ 「AB」]可以搜索(R '(AB)+', 「ababababab」)匹配蟒蛇

>>> re.findall(r'(ab)+', "ababababab") 
['ab'] 

我只知道,使用r'(?:ab)+'所有字符可以匹配所有字符

>>> re.findall(r'(?:ab)+', "ababababab") 
['ababababab'] 

爲什麼會發生這種情況?


對不起,我不會說我的問題顯然

(?:AB)採用 'AB' 作爲一個整體,我們讓C = AB,所以C + = ABABAB ....

所以這顯然是

>>> re.findall(r'(?:ab)+', "ababababab") <br> 
['ababababab'] 

我的問題是,爲什麼會發生這種情況:

>>> match=re.search(r'(ab)+', "ababababab") <br> 
>>> match.group()<br> 
'ababababab' 
+0

很抱歉,但我想我在這裏失蹤的問題。有人能理解它清楚嗎? – 2010-08-25 06:34:38

+0

爲了清楚起見,使用示例進行了編輯。 – 2010-08-25 06:39:26

回答

1

如果模式包含一個組,findall將返回該組而不是整個匹配。這裏(ab)+匹配整個字符串,但只返回組(ab)。

6

我想你問這裏的問題是,爲什麼它返回此:

>>> re.findall(r'(ab)+', "ababababab") 
['ab'] 

的回答是,如果你在模式具有一個或多個組,然後的findAll將返回一個列表的所有匹配組。然而,你的正則表達式有一個在正則表達式中匹配多次的組,所以它取最後一個匹配值。

我想你想要什麼或者是這樣的:

>>> re.findall(r'(ab)', "ababababab") 
['ab', 'ab', 'ab', 'ab', 'ab'] 

或者您發佈的版本:

>>> re.findall(r'(?:ab)+', "ababababab") 
['ababababab'] 
+0

爲了進一步闡明,'r'(?:ab)+''不包含一個組,並且當該模式沒有組時,'re.findall'返回一個包含整個匹配文本的列表。 – jchl 2010-08-25 09:05:42