2015-04-06 14 views
6

Tôi đã dành một chút thời gian để học Biểu thức chính quy, nhưng tôi vẫn không hiểu cách thủ thuật sau đây hoạt động như thế nào khớp hai từ theo thứ tự khác nhau.Kết hợp hai từ theo thứ tự tùy ý bằng cách sử dụng regex

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) 

kết quả

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

enter image description here

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

Tôi biết phần (?=.*) được gọi Positive Lookahead, nhưng làm thế nào nó hoạt động trong tình huống này?

Mọi lời giải thích?

+0

Có rất nhiều giải thích về cách hoạt động của lookaheads. Có lẽ bạn nên đọc một vài trong số họ thay vì yêu cầu chúng tôi viết * một số khác * chỉ dành cho bạn. (Nói cách khác: Đây là một câu hỏi rất cơ bản về một chủ đề được giải thích rõ ràng và được giải thích rõ ràng. Tôi đánh giá cao tính năng này không rõ ràng với người mới bắt đầu, nhưng không có sự giải thích về mọi mức độ kỹ thuật có thể.) – Tomalak

+0

Tôi đã đọc một số hướng dẫn về 'Lookahead tích cực', nhưng tôi không nhớ bất cứ điều gì giải thích điều này. Bạn có thể cung cấp cho tôi một số liên kết hữu ích không? – Aaron

+0

http://www.regular-expressions.info/lookaround.html – Tomalak

Trả lời

1

Nó chỉ không phù hợp trong bất kỳ order.Capturing tùy ý ở đây đang được thực hiện bởi .* trong đó tiêu thụ bất cứ điều gì mà đi kèm của nó way.The positive lookahead làm cho một sự khẳng định .Bạn có hai lookaheads Họ là độc lập với nhau other.Each làm cho một khẳng định một word.So cuối cùng regex của bạn hoạt động như:

1) (?=.*?(John)) === Chuỗi nên có một .Just John một assertion.Does không tiêu thụ bất cứ điều gì

2) (?=.*?(Peter)) === Chuỗi nên có một Peter .Chỉ cần một lời khẳng định.Không tiêu thụ bất cứ thứ gì

3) .* === Tiêu thụ bất cứ điều gì nếu khẳng định đã trôi qua

Vì vậy, bạn thấy đơn đặt hàng không quan trọng ở đây., Những gì là imp là assertions should pass.

+0

Cảm ơn vks, tôi bắt đầu hiểu ý nghĩa của nó. – Aaron

+1

@Aaron 'assertions' là độc lập. Sau đó không xác minh order.Hope bạn không nhầm lẫn và rõ ràng hơn về những gì goin trên đây – vks

Các vấn đề liên quan