2013-12-18 51 views
0

如果我有一子(或「子模式」)在正則表達式交替另一個字符串或模式,像這樣的:蟒蛇re.findall()與子中交替

r'abcd|bc' 

什麼是預期的行爲re.compile(r'abcd|bc').findall('abcd bcd bc ab')

嘗試它,我得到(預期)

['abcd', 'bc', 'bc'] 

,所以我想re.compile(r'bc|abcd').findall('abcd bcd bc ab')可能產生['bc', 'bc', 'bc']而是再次回到

['abcd', 'bc', 'bc'] 

有人能解釋一下嗎?我的印象是,findall會貪婪地返回比賽,但顯然,它會回溯並嘗試匹配交替模式,這會產生更長的令牌。

回答

3

沒有回溯發生根本沒有。你的模式匹配兩種不同類型的字符串; |表示。每個模式都在每個位置進行嘗試。

所以當表達在你輸入開始發現abcd,該文本相匹配的模式就好了,它適合你給它(bcabcd)模式的abcd一部分。

替代零件的訂貨並不在這裏打球,至於正則表達式引擎而言,abcd|bc同樣的事情bc|abcdabcd不會被忽略,因爲bc可能會在稍後的字符串中匹配。

+0

我明白了。謝謝 – tiao