2012-10-04 37 views
17

Tôi dường như không thể tìm cách trích xuất tất cả các nhận xét như trong ví dụ sau.Kết hợp Regex giữa hai chuỗi?

>>> import re 
>>> string = ''' 
... <!-- one 
... --> 
... <!-- two -- -- --> 
... <!-- three --> 
... ''' 
>>> m = re.findall ('<!--([^\(-->)]+)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' three '] 

khối với two -- -- không khớp với nhiều khả năng vì regex xấu. Ai đó có thể xin vui lòng chỉ cho tôi đúng hướng làm thế nào để trích xuất các trận đấu giữa hai dây.


Xin chào, tôi đã thử nghiệm những gì các bạn đề xuất trong nhận xét .... đây là giải pháp làm việc với ít nâng cấp.

>>> m = re.findall ('<!--(.*?)-->', string, re.MULTILINE) 
>>> m 
[' two -- -- ', ' three '] 
>>> m = re.findall ('<!--(.*\n?)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' two -- -- ', ' three '] 

cảm ơn!

+3

mọi thứ giữa [] là ký tự đơn (->) sẽ không tìm kiếm nhóm đó là một phần của sự cố ... –

+2

're.findall ('', string, re.DOTALL)' nên làm. Bạn không cần '^ \ (->)' ở đây, bởi vì dấu hỏi làm cho nó không tham lam. – BrtH

+0

Bạn trông giống như bạn đang tìm kiếm chỉ là những từ? Nếu vậy, có gì sai với 'm = re.findall ('[\ w] +', chuỗi, re.MULTILINE)'? Ngoài ra, chuỗi là một tên thực sự xấu cho một, um, chuỗi. – Ben

Trả lời

32

này nên làm các trick

m = re.findall ('<!--(.*?)-->', string, re.DOTALL) 
+0

cảm ơn bạn đã phản hồi nhanh và chính xác. –

+1

Bạn không cần cờ MULTILINE. –

+0

@AlanMoore, cảm ơn bạn đã đúng. Cập nhật câu trả lời – iruvar

3

Nói chung, nó là không thể làm phù hợp tùy ý giữa hai delimiters với một regular grammar.

Specifcally, nếu bạn cho phép làm tổ,

<!-- how do you deal <!-- with nested --> comments? --> 

bạn sẽ chạy vào vấn đề này. Vì vậy, trong khi bạn có thể giải quyết vấn đề cụ thể này với một biểu thức chính quy, bất kỳ biểu thức chính quy nào mà bạn viết sẽ có thể bị phá vỡ bởi một số nhận xét kỳ lạ khác.

Để phân tích các nhận xét tùy ý, bạn sẽ cần phải chuyển sang phương pháp phân tích cú pháp context free grammars. Một phương pháp đơn giản để làm như vậy là sử dụng pushdown automaton.

+1

Tôi không nghĩ rằng bình luận lồng nhau là tất cả những gì phổ biến. Kinda đánh bại điểm bình luận nếu bất cứ điều gì bên trong nó được xử lý? –

+1

Và có vẻ như chúng không thể thực hiện được trong HTML. http://stackoverflow.com/questions/442786/are-nested-html-comments-possible Tôi sẽ để lại điều này ở đây, bởi vì tôi nghĩ rằng điều quan trọng là phải nhận ra, nhưng tôi không mong đợi bất kỳ upvotes. – Wilduck

+1

Máy trạng thái hữu hạn không thể phân tích cú pháp ngữ pháp tự do ngữ cảnh - bạn có thể sử dụng tự động đẩy xuống. –

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