2010-08-19 17 views
41

मैं तार कि उन्हें अंदर उद्धृत तार (मैं कोड को पार्स कर रहा हूँ, और प्लाई से बचने की कोशिश) के किसी भी संख्या हो सकता था पार्स करने कर रहा हूँ। मैं यह जानना चाहता हूं कि एक सबस्ट्रिंग उद्धृत किया गया है, और मेरे पास सबस्ट्रिंग्स इंडेक्स है। मेरा प्रारंभिक विचार सभी मैचों को खोजने के लिए फिर से उपयोग करना था और फिर उनके द्वारा प्रस्तुत इंडेक्स की सीमा का पता लगाना था।पायथन में सभी रेगेक्स मैचों की अनुक्रमणिका खोजें?

ऐसा लगता है कि मुझे \"[^\"]+\"|'[^']+' जैसे रेगेक्स के साथ फिर से उपयोग करना चाहिए (मैं इस समय ट्रिपल उद्धृत और इस तरह के तारों से निपटने से बच रहा हूं)। जब मैं findall() का उपयोग करता हूं तो मुझे मिलान तारों की एक सूची मिलती है, जो कुछ हद तक अच्छा है, लेकिन मुझे इंडेक्स की आवश्यकता है।

मेरा सबस्ट्रिंग c जितना आसान हो सकता है, और मुझे यह पता लगाने की आवश्यकता है कि यह विशेष c वास्तव में उद्धृत किया गया है या नहीं।

अग्रिम धन्यवाद।

+0

नौकरी की तरह लगता है कि regexes के लिए उपयुक्त नहीं है। –

उत्तर

95

यह तुम क्या चाहते है: (source)

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

वापसी पुनरावर्तक स्ट्रिंग में आरई पैटर्न के लिए सभी गैर-अतिव्यापी मैचों में MatchObject उदाहरणों उपज। स्ट्रिंग स्कैन किए गए बाएं से दाएं हैं, और पाए गए क्रम में मिलान लौटाए जाते हैं। खाली मैचों परिणाम में शामिल जब तक कि वे एक और मैच की शुरुआत स्पर्श कर रहे हैं।

फिर आप MatchObjects से प्रारंभ और समाप्ति स्थिति प्राप्त कर सकते हैं।

उदा

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

बहुत बढ़िया! यह अच्छी तरह से काम करता है। धन्यवाद। – xitrium

+24

ध्यान दें कि आप वास्तव में m.span उपयोग कर सकते हैं '()' पाने के लिए '(m.start(), m.end())' (और डिफ़ॉल्ट समूह तर्क '0', ताकि छोड़ा जा सकता है) है। – Amber

+1

शानदार। बिल्कुल इस के लिए देख रहा था। – armandino

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