دروس الوحدة (4/4)
وحدة إعادة: regex في بيثون
تعرض الوحدة re التعبيرات العادية في لغة Python. إذا كنت قد اتخذت بالفعل
دورة Regex على هذا الموقع، ستجد كل بناء الجملة مألوفًا؛ هنا
نحن ننظر إلى واجهات برمجة التطبيقات.
السلسلة الأولية: 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')]محمي_INLINE_19: استبدال
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 toore.finditer لسلامة الذاكرة
إذا كنت بحاجة إلى معالجة المطابقات في كتلة نصية ضخمة، فإن re.findall يخصص قائمة في الذاكرة تحتوي على جميع سلاسل المطابقة المستخرجة. يُفضل استخدام re.finditer()، الذي ينتج عنه مكرر كسول لكائنات المطابقة، ويستهلك الحد الأدنى من الذاكرة.
جربه
بالنظر إلى `text = 'ordine #123, totale €45.50, ricevuta #456''، قم باستخراج جميع أرقام الطلبات (الأرقام بعد #) في `orders` كقائمة من السلاسل. تقييم "الأوامر".
إظهار التلميح
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 من المحاولات
التحدي الإضافي
قم باستيراد الوحدة \`re\`. استخرج كافة الأرقام التي تتكون من رقم واحد أو أكثر من السلسلة \`log_line = "خطأ 404 في 15 مللي ثانية"\`. قم بتخزين القائمة في \`الأرقام\` وقم بتقييمها.
إظهار التلميح
استخدم re.findall(r'\\d+', log_line) لاستخراج جميع الأرقام كقائمة من السلاسل.
الحل متاح بعد 3 من المحاولات