שיעורי מודול (4/4)
מודול re: regex ב- Python
המודול re חושף ביטויים רגולריים ב- Python. אם כבר לקחת
קורס Regex באתר זה, תמצא את כל התחביר המוכר; כאן
אנחנו מסתכלים על ממשקי ה-API.
מחרוזת גולמית: 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')]re.sub: החלפה
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'זה עובד גם עם פונקציית החלפה (שמקבלת את ה-Match):
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(), אשר מניב איטרטור עצלן של אובייקטי Match, שצורך זיכרון מינימלי.
נסה את זה
בהינתן 'טקסט = 'סדר מס' 123, סך של €45.50, ricevuta #456'`, חלץ את כל מספרי הסדר (הספרות שאחרי #) לתוך 'סדרים' כרשימה של מחרוזות. הערכת `הזמנות`.
הצג רמז
re.findall(r"#(\\d+)", text) — קבוצת לכידה עבור ספרות בלבד.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
בהינתן `s = 'tel: 06-12345678 e tel: 02-9876'`, החלף את כל מספרי הטלפון (בפורמט \\d+-\\d+) במחרוזת 'XXX' והקצה ל'masked'. העריכו 'מסיכות'.
הצג רמז
re.sub(r"\\d+-\\d+", "XXX", s)
הפתרון זמין לאחר 3 ניסיונות
אתגר נוסף
ייבא את המודול \`re\`. חלץ את כל המספרים המורכבים מספרה אחת או יותר מהמחרוזת \`log_line = "שגיאה 404 ב-15ms"\`. אחסן את הרשימה ב-\`מספרים\` והעריך אותה.
הצג רמז
השתמש ב-re.findall(r'\\d+', log_line) כדי לחלץ את כל המספרים כרשימה של מחרוזות.
הפתרון זמין לאחר 3 ניסיונות