2013-07-01 37 views
9

Tôi đang cố gắng khớp mẫu với chuỗi có thể có nhiều phiên bản mẫu. Tôi cần mỗi cá thể riêng biệt. re.findall()nên làm điều đó nhưng tôi không biết mình đang làm gì sai.Python regex để khớp với nhiều lần

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 
match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 

tôi cần 'http://url.com/123', http://url.com/456 và hai số 123 & 456 là yếu tố khác nhau của danh sách match.

Tôi cũng đã thử '/review: ((http://url.com/(\d+)\s?)+)/' làm mẫu, nhưng không may mắn.

+0

chỉ cần loại bỏ đánh giá: phần như http thứ hai sẽ không có mà trước khi nó. – abc123

+0

có nhưng tôi cần ở đó, đó là một phần của regex. Tôi không cần bất kỳ url nào ở đó, chỉ những cái sau chuỗi 'review:' – mavili

Trả lời

12

Sử dụng tính năng này. Bạn cần đặt 'đánh giá' bên ngoài nhóm chụp để đạt được kết quả mong muốn.

pattern = re.compile(r'(?:review:)?(http://url.com/(\d+))\s?', re.IGNORECASE) 

này mang lại cho sản lượng

>>> match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 
>>> match 
[('http://url.com/123', '123'), ('http://url.com/456', '456')] 
+0

thực hiện công việc đó, cảm ơn! '?' sau khi '(?: review)' cũng rất quan trọng vì nó không cho tôi tất cả các trận đấu mà không có nó. ;) – mavili

+0

Đừng quên 'nhập lại ' – Rambatino

5

Bạn có thêm/trong regex. Trong python, pattern chỉ là một chuỗi. ví dụ. thay vì điều này:

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 

Nó nên là:

pattern = re.compile('review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

Cũng thường trong python bạn muốn thực sự sử dụng một "thô" chuỗi như thế này:

pattern = re.compile(r'review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

Các phụ r trên mặt trước của chuỗi giúp bạn tiết kiệm được việc phải thực hiện rất nhiều dấu gạch chéo ngược, v.v.

0

Sử dụng cách tiếp cận hai bước: Đầu tiên hãy tải mọi thứ g từ "đánh giá:" tới EOL, sau đó mã hóa điều đó.

msg = 'this is the message. review: http://url.com/123 http://url.com/456' 

review_pattern = re.compile('.*review: (.*)$') 
urls = review_pattern.findall(msg)[0] 

url_pattern = re.compile("(http://url.com/(\d+))") 
url_pattern.findall(urls) 
Các vấn đề liên quan