2012-07-11 40 views
42
>>> match = re.findall(r'\w\w', 'hello') 
>>> print match 
['he', 'll'] 

Vì \ w \ w có nghĩa là hai ký tự, 'anh ấy' và 'll' được mong đợi. Nhưng tại sao 'el' và 'lo' không phải là khớp với regex?Làm cách nào để tìm các kết quả trùng lặp trùng lặp với regexp?

>>> match1 = re.findall(r'el', 'hello') 
>>> print match1 
['el'] 
>>> 
+2

[Lookahead] (http://stackoverflow.com/questions/320448/overlapping-matches-in-regex) –

Trả lời

70

findall không mang lại kết quả trùng lặp theo mặc định. biểu hiện này không tuy nhiên:

>>> re.findall(r'(?=(\w\w))', 'hello') 
['he', 'el', 'll', 'lo'] 

Dưới đây là một (?=...)lookahead assertion:

(?=...) trận đấu nếu ... trận đấu tiếp theo, nhưng không tiêu thụ bất kỳ chuỗi. Điều này được gọi là xác nhận lookahead. Ví dụ: Isaac (?=Asimov) sẽ chỉ khớp với 'Isaac ' nếu được theo sau bởi 'Asimov'.

7

Ngoại trừ xác nhận độ dài bằng 0, ký tự trong đầu vào sẽ luôn được sử dụng trong kết hợp. Nếu bạn đã bao giờ trong trường hợp bạn muốn nắm bắt một số ký tự trong chuỗi đầu vào nhiều hơn một lần, bạn sẽ cần xác nhận 0-chiều dài trong regex.

Có một số zero-length khẳng định (ví dụ ^ (đầu vào/line), $ (cuối đầu vào/đầu dòng), \b (từ ranh giới)), nhưng nhìn ở quanh ((?<=) tích cực nhìn phía sau và (?=) tích cực nhìn về phía trước) là cách duy nhất để bạn có thể chụp văn bản chồng chéo từ đầu vào. Phủ định xung quanh ((?<!) tiêu cực nhìn phía sau, (?!) tiêu cực nhìn về phía trước) không phải là rất hữu ích ở đây: nếu họ khẳng định sự thật, sau đó chụp bên trong thất bại; nếu họ khẳng định sai, thì trận đấu sẽ thất bại. Các xác nhận này có độ dài bằng 0 (như đã đề cập trước đó), có nghĩa là chúng sẽ khẳng định mà không cần tiêu thụ các ký tự trong chuỗi đầu vào. Họ sẽ thực sự phù hợp với chuỗi rỗng nếu xác nhận vượt qua.

Áp dụng những kiến ​​thức trên, một regex mà làm việc cho trường hợp của bạn sẽ là:

(?=(\w\w)) 
20

Bạn có thể sử dụng new Python regex module, mà hỗ trợ chồng chéo trận đấu.

>>> import regex as re 
>>> match = re.findall(r'\w\w', 'hello', overlapped=True) 
>>> print match 
['he', 'el', 'll', 'lo'] 
Các vấn đề liên quan