2012-09-12 17 views
7

मेरी नियमित अभिव्यक्ति मेरी स्ट्रिंग में कुछ भी नहीं कर रही है।पाइथन नियमित अभिव्यक्ति कुछ भी मिलान

अजगर

data = 'random\n<article stuff\n</article>random stuff' 
datareg = re.sub(r'.*<article(.*)</article>.*', r'<article\1</article>', data, flags=re.MULTILINE) 
print datareg 

मैं

random 
<article stuff 
</article>random stuff 

मिल मैं चाहता हूँ

<article stuff 
</article> 
+2

अरे, c'mon: नहीं [Cthulhu पार्सिंग] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) फिर से । – pillmuncher

+0

@pillmuncher: यह मेरे लिए विकृत HTML जैसा दिखता है, इसलिए मुझे संदेह है कि एक HTML पार्सर बहुत आसानी से इसके साथ काम करने में सक्षम होगा। – Blender

+0

@ ब्लेंडर: मुझे लगता है कि आप सही हैं। लेकिन प्रतिस्थापन या तो वैध एक्सएमएल नहीं लगता है। मुझे आश्चर्य है, किसी को टूटी एक्सएमएल की क्या ज़रूरत है? – pillmuncher

उत्तर

10

re.MULTILINE वास्तव में जिस तरह से आप यह होना चाहता हूँ में अपने रेगुलर एक्सप्रेशन से बहु नहीं है।

निर्दिष्ट होने पर, पैटर्न वर्ण '^' स्ट्रिंग की शुरुआत में और प्रत्येक पंक्ति की शुरुआत में (प्रत्येक नई लाइन के तुरंत बाद) मिलान करता है; और पैटर्न वर्ण '$' स्ट्रिंग के अंत में और प्रत्येक पंक्ति के अंत में मिलान (प्रत्येक नई लाइन से पहले)। डिफ़ॉल्ट रूप से, '^' केवल स्ट्रिंग की शुरुआत में, और स्ट्रिंग के अंत में केवल '$' स्ट्रिंग के अंत में और स्ट्रिंग के अंत में नईलाइन (यदि कोई हो) से पहले मेल खाता है।

re.DOTALL करता है:

'.' विशेष वर्ण सब पर किसी भी चरित्र से मेल खाते हैं, एक नई पंक्ति सहित करो; इस ध्वज के बिना , '.'से कुछ भी को छोड़कर एक नई लाइन से मेल खाएगा।

बदलें flags=re.DOTALL को flags=re.MULTILINE और अपने रेगुलर एक्सप्रेशन से काम करेंगे।

+0

भयानक, सही के रूप में चिह्नित होगा :) धन्यवाद! – user1442957

+0

मेरा दिन बचाया! धन्यवाद – silviomoreto

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