الانتقال إلى المحتوى الرئيسي
الوحدة 8 · الدرس 4 من 432/36 في الدورة~12 min
دروس الوحدة (4/4)

وحدة إعادة: regex في بيثون

تعرض الوحدة re التعبيرات العادية في لغة Python. إذا كنت قد اتخذت بالفعل دورة Regex على هذا الموقع، ستجد كل بناء الجملة مألوفًا؛ هنا نحن ننظر إلى واجهات برمجة التطبيقات.

السلسلة الأولية: 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')]

محمي_INLINE_19: استبدال

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''، قم باستخراج جميع أرقام الطلبات (الأرقام بعد #) في `orders` كقائمة من السلاسل. تقييم "الأوامر".

جارٍ تحميل المحرر…
إظهار التلميح

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جارٍ التحميل…

قم باستيراد الوحدة \`re\`. استخرج كافة الأرقام التي تتكون من رقم واحد أو أكثر من السلسلة \`log_line = "خطأ 404 في 15 مللي ثانية"\`. قم بتخزين القائمة في \`الأرقام\` وقم بتقييمها.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم re.findall(r'\\d+', log_line) لاستخراج جميع الأرقام كقائمة من السلاسل.

الحل متاح بعد 3 من المحاولات