2015-04-06 94 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