2012-10-04 14 views
17

मुझे निम्नलिखित टिप्पणियों जैसे सभी टिप्पणियों को निकालने का कोई तरीका नहीं दिख रहा है। two -- -- साथदो तारों के बीच रेगेक्स मिलान?

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

ब्लॉक बुरा regex की वजह से सबसे अधिक संभावना मेल नहीं खाता है। क्या कोई मुझे सही दिशा में इंगित कर सकता है कि दो तारों के बीच मैचों को कैसे निकाला जाए।


हाय मैं परीक्षण किया है क्या आप लोग टिप्पणी में सुझाव दिया .... यहाँ थोड़ा उन्नयन के साथ समाधान काम कर रहा है।

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

धन्यवाद!

+3

[] के बीच कुछ भी एक वर्ण है इसलिए (->) उस समूह की तलाश नहीं करेगा समस्या का हिस्सा है ... –

+2

're.findall ('', स्ट्रिंग, re.DOTALL) ' कर। आपको यहां '^ \ (->) 'की आवश्यकता नहीं है, क्योंकि प्रश्न चिह्न इसे लालची बनाता है। – BrtH

+0

आप ऐसा लग रहे हैं कि आप केवल शब्दों की तलाश कर रहे हैं? यदि हां, तो 'm = re.findall (' [\ w] + ', स्ट्रिंग, re.MULTILINE) के साथ क्या गलत है? इसके अलावा, स्ट्रिंग एक, उम, स्ट्रिंग के लिए वास्तव में एक बुरा नाम है। – Ben

उत्तर

32

इस चाल

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

तेज़ और सटीक प्रतिक्रिया के लिए धन्यवाद। –

+1

आपको मल्टीलाइन ध्वज की आवश्यकता नहीं है। –

+0

@AlanMoore, धन्यवाद, आप सही हैं। उत्तर – iruvar

3

सामान्य तौर पर क्या करना चाहिए, यह एक regular grammar के साथ दो सीमांकक के बीच मनमाने ढंग से मिलान करने के लिए असंभव है।

specifcally, यदि आप घोंसला बनाने की अनुमति देते हैं,

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

आप मुद्दों के लिए में चला जाएगा। इसलिए, जब आप नियमित अभिव्यक्ति के साथ इस विशिष्ट समस्या को हल करने में सक्षम हो सकते हैं, तो आपके द्वारा लिखे गए किसी भी नियमित अभिव्यक्ति को टिप्पणियों के कुछ अन्य अजीब घोंसले से तोड़ने में सक्षम हो जाएगा।

मनमाने ढंग से टिप्पणियों का विश्लेषण करने के लिए, आपको context free grammars पार्सिंग की विधि पर जाने की आवश्यकता होगी। ऐसा करने के लिए एक आसान तरीका pushdown automaton का उपयोग करना है।

+1

मुझे नहीं लगता कि नेस्टेड टिप्पणियां सभी आम हैं। किंडा इसके अंदर कुछ भी संसाधित होने पर टिप्पणी करने के बिंदु को हरा देता है? –

+1

और ऐसा लगता है कि वे HTML में संभव नहीं हैं। http://stackoverflow.com/questions/442786/are-nested-html-comments- संभव है कि मैं इसे यहां छोड़ने जा रहा हूं, क्योंकि मुझे लगता है कि यह पहचानना महत्वपूर्ण है, लेकिन मुझे किसी भी अपवर्तित की उम्मीद नहीं है। – Wilduck

+1

परिष्कृत राज्य मशीनें संदर्भ मुक्त व्याकरण का विश्लेषण नहीं कर सकती हैं - आप पुशडाउन automatons का उपयोग कर सकते हैं। –

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