2015-10-03 23 views
5

Tôi phải tìm tất cả các chuỗi chỉ được tạo thành từ các chữ cái 'a' và 'b' và mỗi phiên bản của 'a' ngay lập tức được theo sau bởi 'b' và ngay sau đó là 'b'.Làm thế nào để nắm bắt toàn bộ chuỗi trong khi sử dụng 'lookaround' với ký tự trong regex?

Ví dụ:

mystring = 'bab babab babbab ab baba aba xyz' 

Sau đó regex của tôi nên trở lại:

['bab' 'babab' 'babbab'] 

(Trong chuỗi 'ab' - 'a' không được đi trước bởi 'b' Tương tự như vậy cho 'aba'. và 'xyz' không được làm bằng chỉ 'a', 'b')

tôi đã sử dụng lookahead cho điều này và đã viết regex này:.

re.findall(r'((?<=b)a(?=b))',mystring) 

Nhưng điều này chỉ trả lại cho tôi tất cả các trường hợp của 'a' được tiếp/trước bởi 'b' như:

['a','a','a','a'] 

Nhưng tôi cần toàn bộ từ. Làm thế nào tôi có thể tìm thấy toàn bộ từ bằng cách sử dụng regex? Tôi đã cố gắng sửa đổi regex của mình với các tùy chọn khác nhau, nhưng không có gì có vẻ hiệu quả. Điều này có thể giải quyết như thế nào?

Trả lời

3

Bạn có thể sử dụng sau regex:

>>> re.findall(r'\b(?:b+a)+b+\b',mystring) 
['bab', 'babab', 'babbab'] 

Regular expression visualization

Debuggex Demo

Như bạn có thể thấy từ sơ đồ trước, regex này sẽ khớp với bất kỳ sự kết hợp nào của ba (trong đó b có thể xuất hiện nhiều lần), tạo ra các từ mà mỗi a trước b thì toàn bộ chuỗi có thể được theo sau bởi một hoặc thêm b.

+0

cảm ơn nhiều, nó hoạt động .guess i sẽ phải cải thiện sự hiểu biết của tôi về các máy trạng thái hữu hạn –

0

Hãy thử

re.findall(r'(b+ab+)+',mystring); 

nếu bbbabb cũng được phép. Bạn không cần nhìn về phía trước hoặc phía sau.

Edit: Vâng, để phù hợp cũng babab (một chia sẻ b cho cả a) vv nó phải được

re.findall(r'(b+a)+b+',mystring); 
+0

cảm ơn. Nhưng nó không hoạt động nếu chuỗi chứa nhiều trường hợp 'a' như 'babab', 'babbab', 'babab' –

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