2015-04-06 76 views
6

我花了一些時間來學習正則表達式,但我還是不明白下面的技巧是如何工作匹配不同的順序兩個字兩個字以任意順序。匹配使用正則表達式

import re 
reobj = re.compile(r'^(?=.*?(John))(?=.*?(Peter)).*$',re.MULTILINE) 

string = ''' 
John and Peter 
Peter and John 
James and Peter and John 
''' 
re.findall(reobj,string) 

結果

[('John', 'Peter'), ('John', 'Peter'), ('John', 'Peter')] 

enter image description here

https://www.regex101.com/r/qW4rF4/1

我知道(?=.*)部分稱爲Positive Lookahead,但它是如何在這種情況下工作嗎?

任何解釋?

+0

有很多關於lookaheads如何工作的解釋。也許你應該閱讀其中的一些,而不是要求我們爲你寫另一個*。 (換句話說,這是一個關於一個記錄完整且通常解釋清楚的主題的非常基本的問題,我很欣賞這個特性對初學者來說並不是很明顯,但對於每一個可能的技術水平都沒有任何解釋。 ) – Tomalak 2015-04-06 10:07:27

+0

我已經閱讀了一些關於「Positive Lookahead」的教程,但我不記得任何解釋這一點的東西。你能否給我提供一些有用的鏈接? – Aaron 2015-04-06 10:09:30

+0

http://www.regular-expressions.info/lookaround.html – Tomalak 2015-04-06 10:11:30

回答

1

它只是不以任意order.Capturing這裏正在做.*消耗任何事情來匹配其way.The positive lookahead做出斷言。你有兩個lookaheads。他們是獨立的各other.Each使一個斷言一個word.So最後你的正則表達式的工作原理是:

1)(?=.*?(John)) ===字符串應該有一個John。只是一個assertion.Does不消耗任何

2)(?=.*?(Peter)) ===字符串應該有一個Peter 。只是一個斷言。不會消耗任何東西

3).* ===進食任何東西,如果斷言已通過

所以你看到的順序並不重要在這裏,什麼是小鬼是assertions should pass

+0

謝謝vks,我開始明白這個意思。 – Aaron 2015-04-06 10:31:32

+1

@Aaron'assertions'是獨立的。然後不要驗證順序。希望你不會困惑和清楚這裏發生了什麼 – vks 2015-04-06 10:33:37