2017-03-07 100 views
0

當我運行下面的代碼:Python正則表達式lookbehind不一致?

進口重新

s = 'baaaad' 

l = re.findall(r'((a)(?=a))', s) 
print l 
for elem in l: 
    print ''.join(elem) 

我得到的輸出:

[( 'A', 'A'),( 'A', 'A' ),('a','a')] aa aa aa

這是預期的。但是,當我嘗試了回顧後,即相應的策略:

s = 'baaaad' 

l = re.findall(r'((?<=b)(a))', s) 
    print l 
for elem in l: 
    print ''.join(elem) 

我得到:

[( 'A', 'A')] AA

我期待得到:

[('b','a')] ba

爲什麼對我(這個)意外的行爲?如果我做錯了什麼,它是什麼?以及如何解決它?

謝謝!

回答

3

您似乎認爲輸出中的其中一組來自(a),另一組來自前瞻或後視。事實並非如此。其中一組是(a),另一個是從周圍的整個正則表達式的括號:

v v not these 
((?<=b)(a)) 
^  ^these 

先行比賽a,並且回顧後比賽b。它們匹配位置,之後出現a或之前出現b。他們不匹配任何實際的字符。因此,這兩個正則表達式只匹配a,並限制前後的內容,並且兩個正則表達式中的捕獲組僅捕獲a

+0

只需要提一下,在查找'((?<=(b))((a))'' – revo

+0

'中捕獲字符是沒有問題的。所以你在說,即使是對於預見的「正確」答案是因爲其他原因? – whirlaway

+0

@whirlaway:是的。你有兩個可見效果恰好相反的bug,所以它恰好產生你想要的輸出。當你稍微改變了一些東西時,錯誤的影響就停止了。 – user2357112

相關問題