मुख्य सामग्री पर जाएं
मॉड्यूल 8 · पाठ 4 का 4पाठ्यक्रम में 32/36~12 min
मॉड्यूल पाठ (4/4)

पुनः मॉड्यूल: पायथन में रेगेक्स

re मॉड्यूल पायथन में नियमित अभिव्यक्ति को उजागर करता है। यदि आपने पहले ही ले लिया है इस साइट पर रेगेक्स पाठ्यक्रम में आपको सभी सिंटैक्स परिचित मिलेंगे; यहाँ हम एपीआई को देखते हैं।

कच्ची स्ट्रिंग: r"..."

रेगेक्स कई बैकस्लैश (\d, \b, \s) का उपयोग करते हैं। उन्हें हमेशा ऐसे ही लिखें कच्चे तार ताकि आपको उन्हें दोगुना न करना पड़े:

Python
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"

re.search: पहली घटना खोजें

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

यदि पाया जाता है तो Match ऑब्जेक्ट लौटाता है, अन्यथा None लौटाता है। मुहावरेदार पैटर्न:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: केवल स्ट्रिंग की शुरुआत में

Python
re.match(r"\d+", "42 anni")     # match!
re.match(r"\d+", "ho 42 anni")  # None (doesn't start with a digit)

कहीं भी खोजने के लिए re.search को प्राथमिकता दें।

re.findall: सभी घटनाएँ

Python
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']

यदि पैटर्न में कैप्चर समूह है, तो findall समूह लौटाता है, न कि समूह लौटाता है पूरा मैच:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: प्रतिस्थापन

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

यह एक प्रतिस्थापन फ़ंक्शन के साथ भी काम करता है (जो मैच प्राप्त करता है):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

नामित समूह

Python
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno")    # '2025'
m.groupdict()      # {'anno': '2025', 'mese': '01', 'giorno': '15'}

उपयोगी झंडे

Python
re.search(r"ciao", "CIAO", re.IGNORECASE)       # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE)        # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL)            # . matches newline too

स्मृति सुरक्षा के लिए पुनः खोजक

यदि आपको एक विशाल टेक्स्ट ब्लॉक में मिलानों को संसाधित करने की आवश्यकता है, तो re.findall मेमोरी में एक सूची आवंटित करता है जिसमें सभी निकाले गए मिलान स्ट्रिंग्स शामिल हैं। re.finditer() का उपयोग करना पसंद किया जाता है, जो न्यूनतम मेमोरी की खपत करते हुए, मैच ऑब्जेक्ट का एक आलसी पुनरावर्तक उत्पन्न करता है।

इसे अजमाएं

व्यायाम#python.m8.l4.e1
प्रयास: 0लोड हो रहा है...

दिए गए `text = 'ordine #123, totale €45.50, ricevuta #456'`, स्ट्रिंग्स की सूची के रूप में सभी ऑर्डर नंबर (# के बाद के अंक) को `ऑर्डर` में निकालें। `आदेश` का मूल्यांकन करें.

संपादक लोड हो रहा है...
संकेत दिखाएँ

re.findall(r"#(\\d+)", text) - केवल अंकों के लिए समूह कैप्चर करें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#python.m8.l4.e2
प्रयास: 0लोड हो रहा है...

दिया गया `s = 'tel: 06-12345678 e tel: 02-9876'`, सभी फ़ोन नंबर (प्रारूप \\d+-\\d+) को स्ट्रिंग 'XXX' से बदलें और `नकाबपोश' को असाइन करें। 'नकाबपोश' का मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

re.sub(r"\\d+-\\d+", "XXX", s)

3 प्रयासों के बाद समाधान उपलब्ध है

अतिरिक्त चुनौती

व्यायाम#python.m8.l4.e3
प्रयास: 0लोड हो रहा है...

\`re\` मॉड्यूल आयात करें। स्ट्रिंग \`log_line = "Error 404 in 15ms"\` से एक या अधिक अंकों वाली सभी संख्याएँ निकालें। सूची को \`संख्याओं\` में संग्रहीत करें और उसका मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

स्ट्रिंग की सूची के रूप में सभी नंबर निकालने के लिए re.findall(r'\\d+', log_line) का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है