মূল কন্টেন্টে যান
মডিউল 8 · 4-এর পাঠ 4কোর্সে 32/36~12 min
মডিউল পাঠ (4/4)

re মডিউল: পাইথনে regex

re মডিউল পাইথনে রেগুলার এক্সপ্রেশন প্রকাশ করে। যদি আপনি ইতিমধ্যে নেন এই সাইটে রেজেক্স কোর্সে আপনি পরিচিত সব সিনট্যাক্স পাবেন; এখানে আমরা APIs তাকান.

কাঁচা স্ট্রিং: r"..."

Regexes অনেক ব্যাকস্ল্যাশ ব্যবহার করে (\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লোড হচ্ছে...

প্রদত্ত `টেক্সট = 'অর্ডিন #123, মোট €45.50, ricevuta #456'`, স্ট্রিংগুলির একটি তালিকা হিসাবে `অর্ডার'-এ সমস্ত অর্ডার নম্বর (# এর পরে সংখ্যা) বের করুন। 'অর্ডার' মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

re.findall(r"#(\\d+)", টেক্সট) — শুধুমাত্র সংখ্যার জন্য গ্রুপ ক্যাপচার করুন।

সমাধান 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 প্রচেষ্টার পরে উপলব্ধ