Salt la conținutul principal
Modulul 8 · Lecția 4 din 432/36 în curs~12 min
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:

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: găsiți prima apariție

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

Returnează un obiect Match dacă este găsit, None în caz contrar. Model idiomatic:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: numai la începutul șirului

Python
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

Python
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:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: înlocuire

Python
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):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

Grupuri numite

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'}

Steaguri utile

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 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ă

Exercițiu#python.m8.l4.e1
Încercări: 0Se încarcă…

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”.

Se încarcă editorul...
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

Exercițiu#python.m8.l4.e2
Încercări: 0Se încarcă…

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”.

Se încarcă editorul...
Afișează indiciu

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

Soluție disponibilă după 3 încercări

Provocare suplimentară

Exercițiu#python.m8.l4.e3
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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