דילוג לתוכן המרכזי
מודול 8 · שיעור 4 מתוך 432/36 בקורס~12 min
שיעורי מודול (4/4)

מודול re: regex ב- Python

המודול re חושף ביטויים רגולריים ב- Python. אם כבר לקחת קורס Regex באתר זה, תמצא את כל התחביר המוכר; כאן אנחנו מסתכלים על ממשקי ה-API.

מחרוזת גולמית: 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')]

re.sub: החלפה

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

זה עובד גם עם פונקציית החלפה (שמקבלת את ה-Match):

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(), אשר מניב איטרטור עצלן של אובייקטי Match, שצורך זיכרון מינימלי.

נסה את זה

פעילות גופנית#python.m8.l4.e1
ניסיונות: 0טוען...

בהינתן 'טקסט = 'סדר מס' 123, סך של €45.50, ricevuta #456'`, חלץ את כל מספרי הסדר (הספרות שאחרי #) לתוך 'סדרים' כרשימה של מחרוזות. הערכת `הזמנות`.

טוען עורך...
הצג רמז

re.findall(r"#(\\d+)", text) — קבוצת לכידה עבור ספרות בלבד.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#python.m8.l4.e2
ניסיונות: 0טוען...

בהינתן `s = 'tel: 06-12345678 e tel: 02-9876'`, החלף את כל מספרי הטלפון (בפורמט \\d+-\\d+) במחרוזת 'XXX' והקצה ל'masked'. העריכו 'מסיכות'.

טוען עורך...
הצג רמז

re.sub(r"\\d+-\\d+", "XXX", s)

הפתרון זמין לאחר 3 ניסיונות

אתגר נוסף

פעילות גופנית#python.m8.l4.e3
ניסיונות: 0טוען...

ייבא את המודול \`re\`. חלץ את כל המספרים המורכבים מספרה אחת או יותר מהמחרוזת \`log_line = "שגיאה 404 ב-15ms"\`. אחסן את הרשימה ב-\`מספרים\` והעריך אותה.

טוען עורך...
הצג רמז

השתמש ב-re.findall(r'\\d+', log_line) כדי לחלץ את כל המספרים כרשימה של מחרוזות.

הפתרון זמין לאחר 3 ניסיונות