2010-08-19 28 views
41

Tôi đang phân tích các chuỗi có thể có bất kỳ số lượng chuỗi được trích dẫn nào bên trong chúng (tôi đang phân tích cú pháp mã và cố gắng tránh PLY). Tôi muốn tìm hiểu xem một chuỗi con có được trích dẫn không và tôi có chỉ mục cơ sở dữ liệu. Suy nghĩ ban đầu của tôi là sử dụng lại để tìm tất cả các kết quả phù hợp và sau đó tìm ra phạm vi các chỉ mục mà chúng đại diện.Tìm chỉ mục của tất cả các đối sánh regex trong Python?

Có vẻ như tôi nên sử dụng lại với một regex như \"[^\"]+\"|'[^']+' (Tôi tránh giao dịch với ba trích dẫn và các chuỗi như vậy vào lúc này). Khi tôi sử dụng findall() tôi nhận được một danh sách các chuỗi phù hợp, mà là hơi tốt, nhưng tôi cần các chỉ mục.

Chuỗi con của tôi có thể đơn giản như c và tôi cần tìm hiểu xem cụ thể c này có thực sự được trích dẫn hay không.

Xin cảm ơn trước.

+0

Có vẻ như công việc không phù hợp với regex. –

Trả lời

95

Đây là những gì bạn muốn: (source)

re.finditer(pattern, string[, flags]) 

Return một iterator năng suất hợp MatchObject khắp trận đấu không chồng chéo cho các mẫu RE trong chuỗi. Chuỗi là được quét từ trái sang phải và các kết quả khớp được trả về theo thứ tự tìm thấy. Các kết quả trống được bao gồm trong kết quả trừ khi chúng chạm vào đầu của một kết quả phù hợp khác.

Sau đó, bạn có thể nhận được vị trí bắt đầu và kết thúc từ MatchObjects.

ví dụ:

[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)] 
+0

Tuyệt vời! Điều đó hoạt động tốt. Cảm ơn bạn. – xitrium

+24

Lưu ý rằng bạn có thể sử dụng 'm.span()' để nhận '(m.start(), m.end())' (và đối số nhóm mặc định là '0', để có thể bỏ qua). – Amber

+1

Rực rỡ. Đã tìm kiếm chính xác điều này. – armandino

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