2011-11-19 12 views
6

मैं नियमित अभिव्यक्ति चाहता हूं जो "हेड या हेडा" और "हेड" के बीच "लिपटे" ग्रंथों को पाता है। यानी, मेरे पास एक पाठ हो सकता है जो पहले से शुरू होता है सिर या headâ और निम्नलिखित "सिर" के रूप में शब्द टाइप प्रमुख के हैं।पीछे के साथ पाइथन रेगेक्स और विकल्प

  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 .....

मैं केवल पाठ कि में इसलिए मैं "सिर" के बीच हैं कैप्चर करना चाहते हैं पीछे देखो और अहेआ देखो के साथ एक regex है डी अभिव्यक्ति मेरे "सिर" की तलाश में है। जब मैं इस regex पर अमल करने की कोशिश

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) 

हालांकि, मैं कह रहा है कि मैं अभिव्यक्ति के पीछे नज़र में चर लंबाई नहीं हो सकता है एक त्रुटि संदेश मिल रहा है: मैं निम्नलिखित regex की है। इस रेगेक्स में क्या गलत है?

+0

धन्यवाद क्रिस मॉर्गन, वास्तव में – user963386

+0

पढ़ने के लिए बहुत आसान है, वैसे भी आपको अपने अन्य प्रश्नों के उत्तर भी स्वीकार करना चाहिए। – FailedDev

उत्तर

14

वर्तमान में, अपने regex के पहले भाग इस तरह दिखता है:

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

आप दो विकल्प है, एक पांच पात्रों और दूसरे मैचों से मेल खाता है, और यही कारण है कि आपको त्रुटि मिलती है। कुछ रेगेक्स स्वाद आपको ऐसा करने देते हैं, भले ही वे कहते हैं कि वे चर-लंबाई की लम्बाई की अनुमति नहीं देते हैं, लेकिन पायथन नहीं। आप इसे तोड़ने सकता दो lookbehinds में, इस तरह:

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

... लेकिन आप शायद इस लिए lookbehinds वैसे भी जरूरत नहीं है। ऐसा करें:

(?:^HEADa|\bHEAD)\b 

जो भी बाद में (.*?) से मेल किया जाता है अभी भी # 1 समूह के माध्यम से उपलब्ध हो जाएगा। यदि आपको वास्तव में डिलीमीटर के बीच पूरे पाठ की आवश्यकता है, तो आप समूह # 1 में पर कब्जा कर सकते हैं, और वह अन्य समूह # 2 बन जाएगा (या आप नामित समूहों का उपयोग कर सकते हैं, और संख्याओं का ट्रैक नहीं रखना चाहिए) ।

आम तौर पर बोलते हुए, देखो कि आपका पहला उपाय कभी नहीं होना चाहिए। यह नौकरी के लिए स्पष्ट उपकरण की तरह प्रतीत हो सकता है, लेकिन आप आमतौर पर एक सीधा मैच करने और कैप्चरिंग समूह के साथ इच्छित हिस्से को निकालने से बेहतर होते हैं। और यह सभी स्वादों के बारे में सच है, सिर्फ पायथन नहीं; सिर्फ इसलिए कि आप अन्य स्वादों में दिखने के साथ और अधिक कर सकते हैं इसका मतलब यह नहीं है कि होना चाहिए।

बीटीडब्ल्यू, आपने देखा होगा कि मैंने आपकी शब्द सीमाओं को फिर से वितरित किया है; मुझे लगता है कि यह वही है जो आप वास्तव में चाहते थे।

+0

आप मुझे बिंदु पर मिला :) +1। इसके अतिरिक्त आप इस तरह अपने चर को इंटरपोलेट कर सकते हैं: ** regex = re.compile ('(? <=^\ B% s |% s \ b) \ w * \ s \ s (। *?) (? = \ बी% एस \ बी) '% (var [0], var [1], var [1]), re.DOTALL | re.MULTILINE) ** – FailedDev

+0

धन्यवाद बहुत अच्छा स्पष्टीकरण के लिए एलन मूर – user963386

संबंधित मुद्दे