मैं पायथन में एक नियमित अभिव्यक्ति के लिए सभी मैच कैसे पा सकता हूं?


312

एक कार्यक्रम में मैं लिख रहा हूँ मैंने पायथन re.search()को पाठ के एक ब्लॉक में मैच खोजने और परिणामों को प्रिंट करने के लिए फ़ंक्शन का उपयोग किया है । हालाँकि, यह पाठ के ब्लॉक में पहला मैच देखने के बाद प्रोग्राम से बाहर निकल जाता है।

मैं इसे बार-बार कैसे करता हूं, जहां कार्यक्रम बंद नहीं होता है जब तक कि सभी मैच नहीं मिले हैं? क्या ऐसा करने के लिए एक अलग कार्य है?


पुनरावर्ती आरईएस एक अलग जानवर हैं। आप खोज को दोहराना चाहते हैं।
शाम

जवाबों:


545

उपयोग re.findallया re.finditerइसके बजाय।

re.findall(pattern, string) मिलान स्ट्रिंग की सूची देता है।

re.finditer(pattern, string)MatchObjectवस्तुओं पर एक पुनरावृत्ति देता है ।

उदाहरण:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']

18
finditerवही था जिसकी मुझे तलाश थी। मुझे आश्चर्य है कि एक रिटर्न मैच ऑब्जेक्ट्स और दूसरा स्ट्रिंग्स। मैं एक match_allया match_iterफंक्शन का उपयोग करने की उम्मीद कर रहा था ।
dsclose

21
अस्वीकरण: उन लोगों को केवल गैर-अतिव्यापी मैच मिलेंगे
एंटोनी लिज़ी

3
@ एंटोनीलिज़ी, ओवरलैप के साथ पुनरावृत्तियों को कैसे खोजता है?
रक्षा

16
@ रक्षा - re.searchएक लूप में उपयोग करें । यह एक Matchवस्तु वापस कर देंगे । आप लूप के अगले पुनरावृत्ति के लिए तर्क के Match.start() + 1रूप में पारित करना चाहते हैं । posre.search
आर्टऑफवर्फ

3
यदि मैच में एक से अधिक समूह हैं, findallतो मेल खाने वाले टपल्स की सूची लौटाएंगे, मिलान वाले तारों की सूची नहीं।
छड़गोरास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.