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:
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
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5Ritorna un oggetto Match se trova, None se no. Pattern idiomatico:
if m := re.search(r"\d+", testo):
print(m.group())re.match: solo all'inizio della stringa
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
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:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: sostituzione
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'Funziona anche con una funzione di replace (riceve il Match):
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'Gruppi nominati
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
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 newlinere.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
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`.
Mostra suggerimento
re.findall(r"#(\d+)", text) — gruppo di cattura per le sole cifre.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
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`.
Mostra suggerimento
re.sub(r"\d+-\d+", "XXX", s)
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
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.
Mostra suggerimento
Usa re.findall(r'\d+', log_line) per estrarre tutti i numeri come lista di stringhe.
Soluzione disponibile dopo 3 tentativi