Vai al contenuto
eLearner.app
Modulo 8 · Lezione 4 di 432/36 nel corso~12 min
Lezioni del modulo (4/4)

Modulo re: regex in Python

Il modulo re espone le espressioni regolari in Python. Se hai già fatto il corso Regex di questo sito, ritrovi tutta la sintassi; qui vediamo le API.

Raw string: r"..."

Le regex usano molti backslash (\d, \b, \s). Scrivile sempre come raw string per non doverli raddoppiare:

Python
import re
# raw: il \d è un singolo token
pattern = r"\d+"
# NON raw: dovresti scrivere "\\d+" altrimenti Python interpreta \d come "d"

re.search: trova la prima occorrenza

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

Ritorna un oggetto Match se trova, None se no. Pattern idiomatico:

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

re.match: solo all'inizio della stringa

Python
re.match(r"\d+", "42 anni")     # match!
re.match(r"\d+", "ho 42 anni")  # None (non inizia con cifra)

Per cercare ovunque preferisci re.search.

re.findall: tutte le occorrenze

Python
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']

Se il pattern ha gruppi di cattura, findall ritorna i gruppi, non il match intero:

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

re.sub: sostituzione

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

Funziona anche con una funzione di replace (riceve il Match):

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

Gruppi nominati

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

Flag utili

Python
re.search(r"ciao", "CIAO", re.IGNORECASE)       # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE)        # ^/$ matchano ogni riga
re.search(r"a.b", "a\nb", re.DOTALL)            # . matcha anche newline

re.finditer per risparmiare memoria

Se devi elaborare molti match in un testo enorme, re.findall alloca in memoria una lista contenente tutte le stringhe estratte. È preferibile usare re.finditer(), che restituisce un iteratore lazy di oggetti Match, consumando memoria minima.

Prova tu

Esercizio#python.m8.l4.e1
Tentativi: 0Caricamento…

Data `text = 'ordine #123, totale €45.50, ricevuta #456'`, estrai TUTTI i numeri di ordine (le cifre dopo #) in `orders` come lista di stringhe. Valuta `orders`.

Caricamento editor…
Mostra suggerimento

re.findall(r"#(\d+)", text) — gruppo di cattura per le sole cifre.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m8.l4.e2
Tentativi: 0Caricamento…

Data `s = 'tel: 06-12345678 e tel: 02-9876'`, sostituisci tutti i numeri di telefono (formato \\d+-\\d+) con la stringa 'XXX' e assegna a `masked`. Valuta `masked`.

Caricamento editor…
Mostra suggerimento

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

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m8.l4.e3
Tentativi: 0Caricamento…

Importa il modulo `re`. Estrai tutti i numeri di una o più cifre contenuti nella stringa `log_line = "Error 404 in 15ms"`. Salva la lista in `numbers` e valutala.

Caricamento editor…
Mostra suggerimento

Usa re.findall(r'\d+', log_line) per estrarre tutti i numeri come lista di stringhe.

Soluzione disponibile dopo 3 tentativi