2012-07-10 34 views
5

Có cách nào để kết hợp các nhóm và các tính năng * của các cụm từ thông dụng để hoạt động giống như một trình mã thông báo/bộ tách. Tôi cố gắng này:Các nhóm Regex và * ký tự đại diện có hoạt động cùng nhau không?

my_str = "foofoofoofoo" 
pattern = "(foo)*" 
result = re.search(pattern, my_str) 

Tôi đã hy vọng nhóm của tôi có thể trông giống như

("foo", "foo", "foo", "foo") 

Nhưng nó không. Tôi đã ngạc nhiên bởi điều này bởi vì? và các tính năng của nhóm hoạt động cùng nhau:

my_str= "Mr foo" 
pattern = "(Mr)? foo" 
result = re.search(pattern, my_str) 
+3

tôi nghi ngờ rằng sẽ làm việc, nhưng bạn có thể có được những gì bạn muốn sử dụng 're.findall (" foo "," foofoofoofoo ")'. Oh, và xin vui lòng không sử dụng 'str' như một tên biến. –

+0

Tôi đã thay đổi 'str' thành' my_str' vì 'str' shadows được tích hợp sẵn. – jamylak

+0

ha vâng xin lỗi, str chỉ là một ví dụ. Mã đó có lẽ không phải là cú pháp chính xác. Ngoài ra, tôi đã thấy phương pháp findall và điều đó chắc chắn sẽ hoạt động. Tôi chỉ tò mò một cách tổng quát hơn. –

Trả lời

4

Sự cố là bạn lặp lại nhóm chụp duy nhất của mình. Điều đó có nghĩa là bạn chỉ có một khung ==> một nhóm chụp và nhóm chụp này sẽ bị ghi đè mỗi khi nó khớp.

Xem Repeating a Capturing Group vs. Capturing a Repeated Group trên regular-expression.info để biết thêm thông tin. (Nhưng việc chụp một nhóm lặp lại cũng không phải là điều bạn muốn)

Vì vậy, sau khi hoàn thành regex, nhóm chụp 1 của bạn sẽ chứa "foo" được tìm thấy lần cuối.

này sẽ sẽ cung cấp cho bạn những kết quả mong đợi:

my_str = "foofoofoofoo" 
pattern = "foo" 
result = re.findall(pattern, my_str) 

kết quả là sau đó một danh sách ['foo', 'foo', 'foo', 'foo']

+0

+1 cho liên kết rất hữu ích. Cảm ơn bạn! –

+0

thú vị. Cảm ơn. –

3

Ghi nhóm và * không hoạt động với mô-đun được xây dựng lại - sử dụng findall thay thế.

Có thư viện có tên là regex trong pypi mà tôi tin rằng hỗ trợ cú pháp đó và có một vài tính năng khác như theo dõi độ dài biến đổi.

+0

Điều đó sẽ giải thích mọi thứ. Cảm ơn. –

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