2011-11-19 13 views
6

Tôi muốn có một biểu thức chính quy để tìm các văn bản được "gói" ở giữa "HEAD hoặc HEADa" và "HEAD. Đó là, tôi có thể có một văn bản bắt đầu bằng từ như HEAD hay HEADa và "người đứng đầu" sau đây là những loại HEAD.Python regex với cái nhìn phía sau và lựa chọn thay thế

  1. HEAD\n\n text...text...HEAD \n\n text....text HEAD\n\n text....text .....
  2. HEADa\n\n text...text...HEAD \n\n text....text HEAD\n\n text....text .....

tôi muốn chỉ để chụp văn bản mà là ở giữa "người đứng đầu" vì vậy, tôi có một regex với cái nhìn phía sau và nhìn ahea d biểu hiện tìm kiếm "đầu" của tôi. Tôi có regex sau đây:

var = "HEADa", "HEAD" 

my_pat = re.compile(r"(?<=^\b"+var[0]+r"|"+var[1]+r"\b) \w*\s\s(.*?)(?=\b"+var[1] +r"\b)",re.DOTALL|re.MULTILINE) 

Tuy nhiên, khi tôi cố gắng thực hiện regex này, tôi nhận được thông báo lỗi nói rằng tôi không thể có độ dài thay đổi trong giao diện phía sau. Điều gì là sai với regex này?

+0

Cảm ơn Chris Morgan, dễ đọc hơn rất nhiều – user963386

+0

Bằng cách này bạn cũng nên chấp nhận câu trả lời cho các câu hỏi khác của mình. – FailedDev

Trả lời

14

Hiện nay, phần đầu của regex của bạn trông như thế này:

(?<=^\bHEADa|HEAD\b) 

Bạn có hai lựa chọn thay thế; một cái khớp với năm ký tự và cái kia khớp với bốn ký tự, và đó là lý do tại sao bạn gặp lỗi. Một số hương vị regex sẽ cho phép bạn làm điều đó mặc dù họ nói rằng họ không cho phép lookbehinds biến chiều dài, nhưng không phải Python. Bạn thể chia nó ra thành hai lookbehinds, như thế này:

(?:(?<=^HEADa\b)|(?<=\bHEAD\b)) 

... nhưng có lẽ bạn không cần lookbehinds cho điều này anyway. Hãy thử thay thế này:

(?:^HEADa|\bHEAD)\b 

Bất kỳ thứ gì được khớp với số (.*?) sau này sẽ vẫn có sẵn thông qua nhóm # 1. Nếu bạn thực sự cần toàn bộ văn bản giữa các dấu phân tách, bạn có thể chụp rằng trong nhóm số 1 và nhóm kia sẽ trở thành số 2 (hoặc bạn có thể sử dụng các nhóm được đặt tên và không phải theo dõi các số) .

Nói chung, chắc chắn không bao giờ là resort đầu tiên của bạn. Nó có vẻ giống như công cụ rõ ràng cho công việc, nhưng bạn thường tốt hơn làm một trận đấu thẳng và trích xuất phần bạn muốn với một nhóm chụp. Và đó là sự thật của tất cả các hương vị, không chỉ là Python; chỉ vì bạn có thể làm được nhiều việc hơn với những ý tưởng trong các hương vị khác không có nghĩa là bạn nên.

BTW, bạn có thể nhận thấy rằng tôi đã phân phối lại ranh giới từ của bạn; Tôi nghĩ rằng đây là những gì bạn thực sự dự định.

+0

Bạn đã cho tôi đến điểm :) +1. Ngoài ra bạn có thể nội suy biến của bạn như thế này: ** regex = re.compile ('(? <=^\ B% s |% s \ b) \ w * \ s \ s (. *?) (? = \ b% s \ b) '% (var [0], var [1], var [1]), re.DOTALL | re.MULTILINE) ** – FailedDev

+0

Cảm ơn Allan Moore đã giải thích rất tốt – user963386