ماڈیول اسباق (4/4)
دوبارہ ماڈیول: ازگر میں ریجیکس
re ماڈیول Python میں ریگولر ایکسپریشنز کو ظاہر کرتا ہے۔ اگر آپ نے پہلے ہی لے لیا ہے۔
اس سائٹ پر ریجیکس کورس، آپ کو تمام نحو سے واقفیت مل جائے گی۔ یہاں
ہم APIs کو دیکھتے ہیں۔
خام تار: r"..."
ریجیکسز بہت سے بیک سلیشز استعمال کرتی ہیں (\d, \b, \s)۔ انہیں ہمیشہ اس طرح لکھیں۔
کچی تاریں لہذا آپ کو ان کو دوگنا کرنے کی ضرورت نہیں ہے:
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: پہلا واقعہ تلاش کریں۔
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5اگر مل جائے تو Match آبجیکٹ لوٹاتا ہے، ورنہ None۔ محاوراتی نمونہ:
if m := re.search(r"\d+", testo):
print(m.group())re.match: صرف سٹرنگ کے شروع میں
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: تمام واقعات
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']اگر پیٹرن میں کیپچر گروپس ہیں، تو findall گروپس کو واپس کرتا ہے، نہ کہ
پورا میچ:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: متبادل
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'یہ متبادل فنکشن کے ساتھ بھی کام کرتا ہے (جو میچ وصول کرتا ہے):
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'نامزد گروپس
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'}مفید جھنڈے
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() استعمال کرنے کو ترجیح دی جاتی ہے، جو کم سے کم میموری استعمال کرتے ہوئے، میچ آبجیکٹ کا ایک سست تکرار پیدا کرتا ہے۔
اسے آزمائیں
دیا `text = 'ordine #123, totale €45.50, ricevuta #456'`، تمام آرڈر نمبرز (# کے بعد کے ہندسوں) کو سٹرنگز کی فہرست کے طور پر `آرڈرز` میں نکالیں۔ 'آرڈرز' کا اندازہ کریں۔
اشارہ دکھائیں۔
re.findall(r"#(\\d+)", text) — کیپچر گروپ صرف ہندسوں کے لیے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
`s = 'tel: 06-12345678 e tel: 02-9876'` کو دیکھتے ہوئے، تمام فون نمبرز (فارمیٹ \\d+-\\d+) کو 'XXX' سٹرنگ سے تبدیل کریں اور `ماسکڈ` کو تفویض کریں۔ 'نقاب پوش' کا اندازہ کریں۔
اشارہ دکھائیں۔
re.sub(r"\\d+-\\d+", "XXX", s)
3 کوششوں کے بعد حل دستیاب ہے۔
اضافی چیلنج
\`دوبارہ\` ماڈیول درآمد کریں۔ سٹرنگ \`log_line = "Error 404 in 15ms"\` سے ایک یا زیادہ ہندسوں پر مشتمل تمام نمبر نکالیں۔ فہرست کو \`نمبر\` میں محفوظ کریں اور اس کا اندازہ کریں۔
اشارہ دکھائیں۔
تمام نمبروں کو تاروں کی فہرست کے طور پر نکالنے کے لیے re.findall(r'\\d+', log_line) کا استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔