पायथन रेगेक्स - मैच के पदों और मूल्यों को कैसे प्राप्त करें


112

मैं reमॉड्यूल का उपयोग करके सभी मैचों की शुरुआत और समाप्ति स्थिति कैसे प्राप्त कर सकता हूं ? उदाहरण के लिए दिया गया पैटर्न r'[a-z]'और स्ट्रिंग 'a1b2c3d4'मैं उन पदों को प्राप्त करना चाहता हूं जहां यह प्रत्येक अक्षर पाता है। आदर्श रूप से, मैं मैच का पाठ भी वापस लेना चाहता हूं।


देखें कि क्या यह मैच ऑब्जेक्ट्स में
EBGreen

जवाबों:


140
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
    print(m.start(), m.group())

3
यह एक मैच रेगेक्स = r '([az]) (0-9)' m.start समूह (), न कि समूह (1)
StevenWernerCS

@StevenWernerCS start()एक समूह संख्या को स्वीकार कर सकता है, इसलिए यदि आप nth समूह का सूचकांक चाहते हैं, तो उपयोग करेंstart(n)
Hi-Angel

@ हाय-परी हां, पिछले साल से नीचे मेरा जवाब देखिए जो बस इतना ही करता है
StevenWernerCS

51

से लिया गया

नियमित अभिव्यक्ति HOWTO

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

>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

इसके साथ मिलाएं:

पायथन 2.2 में, खोजक () विधि भी उपलब्ध है, जो पुनरावृत्ति के रूप में मैचऑबजेक्ट इंस्टेंस का एक क्रम लौटाता है।

>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

आप के आदेश पर कुछ करने में सक्षम होना चाहिए

for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
   print match.span()

आप इसका उपयोग कर सकते हैं re.search(r'abbit', "has abbit of carrot").span(0)-(4, 9)
Константин Ван

span()पाइथन के स्लाइस अंकन में 'स्टॉप' की तरह 'एंड इंडेक्स' लौटा है, लेकिन यह उस इंडेक्स में शामिल नहीं है; यहाँ देखें ।
वेन

20

पायथन 3.x के लिए

from re import finditer
for match in finditer("pattern", "string"):
    print(match.span(), match.group())

\nस्ट्रिंग में प्रत्येक हिट के लिए आपको अलग-अलग ट्यूपल्स (क्रमशः, क्रमशः और मैच के पहले और अंतिम सूचक) और मैच मिलेंगे ।


2

ध्यान दें कि एक रेगेक्स में मल्टी कैप्चर समूहों के लिए स्पैन और समूह अनुक्रमित हैं

regex_with_3_groups=r"([a-z])([0-9]+)([A-Z])"
for match in re.finditer(regex_with_3_groups, string):
    for idx in range(0, 4):
        print(match.span(idx), match.group(idx))

1
धन्यवाद, यह सुपर उपयोगी साबित हुआ है और काफी दफन हो गया है। इसके अलावा, इस मामले में किसी को भी इस की जरूरत है: जब नामित कैप्चर समूहों के उपयोग, एक <मैच> .re.groupindex, और से इसी अवधि दृष्टिकोण आप उल्लिखित का उपयोग कर वहाँ लगता है का उपयोग करते हुए एक समूह का सूचकांक पा सकते हैं
madimov

कहा 4से आता है
रेडियो ने

@RadioControlled संख्या_of_ogn_groups_in_the_regex + 1, जैसा कि सीमा है [प्रारंभ, अंत) अनन्य का अंत
StevenWernerCS

@StevenWernerCS इसलिए यह उन मामलों के लिए सामान्य नहीं है जहाँ समूहों की संख्या ज्ञात नहीं है ...
रेडियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.