Lecții din modul (4/4)
re modul: regex în Python
Modulul re expune expresii regulate în Python. Dacă ai luat deja
cursul Regex de pe acest site, veți găsi toată sintaxa familiară; aici
ne uităm la API-uri.
Șir brut: r"..."
Regexe folosesc multe bare oblice inverse (\d, \b, \s). Scrieți-le întotdeauna ca
șiruri brute, astfel încât să nu fie nevoie să le dublezi:
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: găsiți prima apariție
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5Returnează un obiect Match dacă este găsit, None în caz contrar. Model idiomatic:
if m := re.search(r"\d+", testo):
print(m.group())re.match: numai la începutul șirului
re.match(r"\d+", "42 anni") # match!
re.match(r"\d+", "ho 42 anni") # None (doesn't start with a digit)Pentru a căuta oriunde preferați re.search.
re.findall: toate aparițiile
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']Dacă modelul are capture groups, findall returnează grupurile, nu
întreg meciul:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: înlocuire
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'De asemenea, funcționează cu o funcție de înlocuire (care primește meciul):
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'Grupuri numite
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'}Steaguri utile
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 pentru siguranta memoriei
Dacă trebuie să procesați potrivirile într-un bloc de text uriaș, re.findall alocă o listă în memorie care conține toate șirurile de potrivire extrase. Este de preferat să utilizați re.finditer(), care generează un iterator leneș de obiecte Match, consumând memorie minimă.
Încearcă
Având în vedere `text = 'ordine #123, total €45.50, ricevuta #456'`, extrageți TOATE numerele de ordine (cifrele după #) în `comenzi` ca o listă de șiruri. Evaluați „comenzi”.
Afișează indiciu
re.findall(r"#(\\d+)", text) — grup de captare numai pentru cifre.
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Dat `s = 'tel: 06-12345678 e tel: 02-9876'`, înlocuiți toate numerele de telefon (format \\d+-\\d+) cu șirul 'XXX' și atribuiți-le `mask`. Evaluați „mascat”.
Afișează indiciu
re.sub(r"\\d+-\\d+", "XXX", s)
Soluție disponibilă după 3 încercări
Provocare suplimentară
Importați modulul \`re\`. Extrageți toate numerele formate din una sau mai multe cifre din șirul \`log_line = "Eroarea 404 în 15 ms"\`. Stocați lista în \`numere\` și evaluați-o.
Afișează indiciu
Utilizați re.findall(r'\\d+', log_line) pentru a extrage toate numerele ca o listă de șiruri.
Soluție disponibilă după 3 încercări