مرکزی مواد پر جائیں
ماڈیول 8 · سبق 4 از 4کورس میں 32/36~12 min
ماڈیول اسباق (4/4)

دوبارہ ماڈیول: ازگر میں ریجیکس

re ماڈیول Python میں ریگولر ایکسپریشنز کو ظاہر کرتا ہے۔ اگر آپ نے پہلے ہی لے لیا ہے۔ اس سائٹ پر ریجیکس کورس، آپ کو تمام نحو سے واقفیت مل جائے گی۔ یہاں ہم APIs کو دیکھتے ہیں۔

خام تار: 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.finditer

اگر آپ کو ایک بڑے ٹیکسٹ بلاک میں میچوں پر کارروائی کرنے کی ضرورت ہے تو، 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لوڈ ہو رہا ہے…

\`دوبارہ\` ماڈیول درآمد کریں۔ سٹرنگ \`log_line = "Error 404 in 15ms"\` سے ایک یا زیادہ ہندسوں پر مشتمل تمام نمبر نکالیں۔ فہرست کو \`نمبر\` میں محفوظ کریں اور اس کا اندازہ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

تمام نمبروں کو تاروں کی فہرست کے طور پر نکالنے کے لیے re.findall(r'\\d+', log_line) کا استعمال کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔