মডিউল পাঠ (4/4)
re মডিউল: পাইথনে regex
re মডিউল পাইথনে রেগুলার এক্সপ্রেশন প্রকাশ করে। যদি আপনি ইতিমধ্যে নেন
এই সাইটে রেজেক্স কোর্সে আপনি পরিচিত সব সিনট্যাক্স পাবেন; এখানে
আমরা APIs তাকান.
কাঁচা স্ট্রিং: r"..."
Regexes অনেক ব্যাকস্ল্যাশ ব্যবহার করে (\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() ব্যবহার করা পছন্দনীয়, যা ন্যূনতম মেমরি ব্যবহার করে ম্যাচ বস্তুর একটি অলস পুনরাবৃত্তি করে।
চেষ্টা করে দেখুন
প্রদত্ত `টেক্সট = 'অর্ডিন #123, মোট €45.50, ricevuta #456'`, স্ট্রিংগুলির একটি তালিকা হিসাবে `অর্ডার'-এ সমস্ত অর্ডার নম্বর (# এর পরে সংখ্যা) বের করুন। 'অর্ডার' মূল্যায়ন করুন।
ইঙ্গিত দেখান
re.findall(r"#(\\d+)", টেক্সট) — শুধুমাত্র সংখ্যার জন্য গ্রুপ ক্যাপচার করুন।
সমাধান 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 প্রচেষ্টার পরে উপলব্ধ