2009-04-19 35 views
79

Làm cách nào để tạo một regex python như "(. *)" Sao cho, cho "a (b) c (d) e" python khớp với "b" thay vì "b) c (d "?Python không tham lam regexes

Tôi biết rằng tôi có thể sử dụng" [^)] "thay vì". ", Nhưng tôi đang tìm một giải pháp tổng quát hơn giúp regex của tôi sạch hơn một chút. Có cách nào để nói với python "hey, phù hợp với điều này càng sớm càng tốt"?

Trả lời

97
+0

Theo Lưu trữ Internet, tất cả liên kết được trỏ đến là bản sao tài liệu mô-đun "tái" của Python, vì vậy liên kết của Trey cũng hoạt động tốt. – spiffytech

+1

tên tiếng Anh thông dụng cho '*?' Này là gì? –

+0

Ký tự đại diện @Trevor Boyd Smith – Serge

11

Sẽ không phải \\(.*?\\) làm việc? Đó là cú pháp không tham lam.

51
>>> x = "a (b) c (d) e" 
>>> re.search(r"\(.*\)", x).group() 
'(b) c (d)' 
>>> re.search(r"\(.*?\)", x).group() 
'(b)' 

According to the docs:

Các '*', '+', và '?' vòng loại đều tham lam; chúng khớp với càng nhiều văn bản càng tốt. Đôi khi hành vi này không được mong muốn; nếu RE <.*> được đối sánh với '<H1>title</H1>', nó sẽ khớp với toàn bộ chuỗi và không chỉ '<H1>'. Thêm '?' sau khi vòng loại làm cho nó thực hiện các trận đấu trong thời trang không tham lam hoặc tối thiểu; ít ký tự nhất có thể sẽ được so khớp. Sử dụng .*? trong biểu thức trước sẽ chỉ khớp với '<H1>'.

+1

[Không bao giờ phân tích cú pháp HTML với regex] (https://stackoverflow.com/a/1732454) –

2

Bạn có muốn nó khớp với "(b)" không? Làm như Zitrax và Paolo đã gợi ý. Bạn có muốn nó khớp với "b" không? Do

>>> x = "a (b) c (d) e" 
>>> re.search(r"\((.*?)\)", x).group(1) 
'b' 
2

Sử dụng kết quả không phù hợp là khởi đầu tốt, nhưng tôi cũng khuyên bạn nên xem xét lại việc sử dụng .* - còn điều này thì sao?

groups = re.search(r"\([^)]*\)", x) 
5

Như những người khác đã nói bằng cách sử dụng? sửa đổi trên quantifier * sẽ giải quyết vấn đề trước mắt của bạn, nhưng hãy cẩn thận, bạn đang bắt đầu đi lạc vào các khu vực mà regexes ngừng làm việc và bạn cần một phân tích cú pháp để thay thế. Ví dụ, chuỗi "(foo (bar)) baz" sẽ gây ra vấn đề cho bạn.

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