Le espres­sio­ni regolari, in breve RegEx, possono essere uti­liz­za­te in Python dopo aver importato il pacchetto integrato “re” per cercare de­ter­mi­na­ti modelli all’interno delle stringhe.

Cosa sono esat­ta­men­te le RegEx in Python?

Per RegEx si intendono le espres­sio­ni regolari, ovvero stringhe che de­fi­ni­sco­no modelli di ricerca specifici. Possono essere uti­liz­za­te per trovare cor­ri­spon­den­ze di modelli nelle stringhe in Python. Seguono una propria sintassi e una propria semantica.

N.B.

Le espres­sio­ni regolari sono un costrutto di pro­gram­ma­zio­ne avanzato, che pochi tutorial di Python trattano in modo det­ta­glia­to. Se siete in­te­res­sa­ti ad altri aspetti avanzati della pro­gram­ma­zio­ne in Python, vi sug­ge­ria­mo questi articoli:

Campi di ap­pli­ca­zio­ne delle RegEx in Python

Le espres­sio­ni regolari sono spesso uti­liz­za­te per cercare un de­ter­mi­na­to formato negli input degli utenti di un programma.

Un caso che si­cu­ra­men­te co­no­sce­re­te già è ad esempio la creazione di una password che deve contenere almeno una lettera maiuscola e almeno un numero. Le RegEx di Python possono essere uti­liz­za­te per con­trol­la­re che l’input sia conforme alle regole.

Spesso anche per la com­pi­la­zio­ne di moduli web si uti­liz­za­no le espres­sio­ni regolari per ve­ri­fi­ca­re la validità dei dati inseriti dagli utenti. Così, ad esempio, si può valutare se l’indirizzo e-mail inserito è ef­fet­ti­va­men­te un indirizzo e-mail con il formato valido.

Consiglio

Se lavorate a un progetto web con Python, le espres­sio­ni regolari vi tor­ne­ran­no utili in molte si­tua­zio­ni. Un altro strumento valido è Deploy Now di IONOS, che vi permette di compilare e di­stri­bui­re i vostri progetti web di­ret­ta­men­te tramite GitHub.

Sintassi e semantica delle RegEx in Python

All’interno delle espres­sio­ni regolari si uti­liz­za­no i co­sid­det­ti me­ta­ca­rat­te­ri. Si tratta di caratteri che nelle RegEx di Python hanno un si­gni­fi­ca­to par­ti­co­la­re. Trovate i me­ta­ca­rat­te­ri prin­ci­pa­li, il loro si­gni­fi­ca­to e un esempio nella tabella seguente:

Carattere De­scri­zio­ne Esempio
. Indica qualsiasi carattere, tranne le in­ter­ru­zio­ni di riga (newline) “ci.o” -> trova tutte le stringhe che iniziano con “ci“, seguito da un carattere qualsiasi, e che terminano in “o”, ad esempio “ciao”
[] Trova tutte le lettere indicate dentro le parentesi “[a-e]” -> trova tutte le lettere minuscole tra a ed e
^ Controlla se la stringa inizia con il carattere o la sequenza di caratteri spe­ci­fi­ca­ti “^ciao” -> verifica se la stringa inizia con “ciao”
$ Controlla se la stringa termina con il carattere o la sequenza di caratteri spe­ci­fi­ca­ti “$mondo” -> controlla se la stringa finisce con “mondo”
* Nessuna ri­cor­ren­za o ri­cor­ren­za multipla di un carattere “a*” -> trova la cor­ri­spon­den­za con un numero qualsiasi di a oppure con nessuna a
+ Presenza singola o multipla di un carattere “a+” -> trova la cor­ri­spon­den­za con almeno una a
? Una o nessuna oc­cor­ren­za di un carattere “a?” -> trova la cor­ri­spon­den­za con una sola a o con nessuna a
{} Verifica se un carattere è presente con la stessa frequenza indicata tra le parentesi graffe “ci{1}o” -> trova la cor­ri­spon­den­za nella stringa “ciao”

Set

Per la maggior parte delle RegEx di Python sono par­ti­co­lar­men­te im­por­tan­ti i set, che vale la pena di ana­liz­za­re più da vicino. I set sono modelli RegEx che iniziano e finiscono con parentesi quadre. Nella tabella sopra avete già visto un esempio di set che trova tutte le lettere minuscole tra a ed e. Di seguito trovate un riepilogo dei casi di utilizzo più frequenti dei set nelle RegEx in Python:

Set De­scri­zio­ne
[abc] Trova la cor­ri­spon­den­za quando uno dei caratteri indicati tra parentesi (dunque a, b o c) è presente all’interno di una stringa
[^abc] Trova tutti i caratteri non indicati tra le parentesi
[a-z] Cor­ri­spon­de a tutte le lettere minuscole tra a e z
[a-zA-Z] Trova tutte le lettere tra a e z, a pre­scin­de­re che siano maiuscole o minuscole
[0-9] Cor­ri­spon­de con qualsiasi numero tra 0 e 9
[1-5][0-9] Trova tutti i numeri a due cifre tra 10 e 59

Come potete vedere, i set sono uno strumento potente per diverse espres­sio­ni regolari. Dovete tuttavia tenere presente che i me­ta­ca­rat­te­ri pre­sen­ta­ti sopra non hanno alcun si­gni­fi­ca­to specifico all’interno delle parentesi quadre. Il set [] trova quindi tutti gli in una data stringa.

Sequenze

Oltre ai me­ta­ca­rat­te­ri di cui abbiamo parlato sopra, nelle RegEx di Python potete uti­liz­za­re sequenze pre­de­fi­ni­te per creare modelli di ricerca precisi.

Sequenza De­scri­zio­ne Esempio
\A Trova la cor­ri­spon­den­za quando la sequenza di caratteri spe­ci­fi­ca­ta si trova all’inizio di una stringa. “\ALunedì”
  • Trova “Lunedì è una giornata fan­ta­sti­ca.”
  • Non trova “È lunedì.”
\b Trova la cor­ri­spon­den­za quando la sequenza di caratteri spe­ci­fi­ca­ta si trova all’inizio o alla fine di una parola. “\bve”
  • Trova “Lunedì piove.”
  • Trova “Venire”
  • Non trova “Avvenire” “ve\b”
  • Trova “Dove”
  • Trova “Lunedì piove di nuovo”
  • Non trova “Polvere”
\B Trova la cor­ri­spon­den­za quando la sequenza di caratteri spe­ci­fi­ca­ta non si trova all’inizio o alla fine di una parola; è il contrario di \b “\Bve”
  • Non trova “Lunedì piove.”
  • Non trova “Venire”
  • Trova “Avvenire” “ve\B”
  • Non trova “Dove”
  • Non trova “Lunedì piove di nuovo”
  • Trova “Polvere”
\d Trova tutte le cifre fra 0 e 9; equi­va­len­te a [0-9] “123”
  • \d trova tre cor­ri­spon­den­ze per 1, 2 e 3
\D Trova tutti i caratteri che non sono cifre; equi­va­len­te a [^0-9] “123acb&”
  • \D trova quattro cor­ri­spon­den­ze per a, c, b e &
\s Trova la cor­ri­spon­den­za quando la stringa contiene uno spazio “Python RegEx”
  • \s cor­ri­spon­de quando c’è uno spazio
\S Trova la cor­ri­spon­den­za quando la stringa non contiene nessuno spazio; è il contrario di \s “Python RegEx”
  • \S non trova cor­ri­spon­den­ze, perché c’è uno spazio
\w Trova tutti i caratteri al­fa­nu­me­ri­ci “1abc$%3”
  • \w trova quattro cor­ri­spon­den­ze per 1, a, b, c e 3
\W Trova tutti i caratteri tranne quelli al­fa­nu­me­ri­ci; è il contrario di \w <“1abc$%3”
  • \W trova due cor­ri­spon­den­ze per $ e %
\Z Trova la cor­ri­spon­den­za quando la sequenza di caratteri spe­ci­fi­ca­ta si trova alla fine di una stringa “Python\Z”
  • Trova “RegEx in Python”
  • Non trova “Python RegEx”

Funzioni per usare le RegEx in Python

Per uti­liz­za­re le RegEx in Python sono di­spo­ni­bi­li svariate funzioni pre­de­fi­ni­te. Tutte queste funzioni si trovano in un modulo Python chiamato “re”, che deve essere importato prima di poter lavorare con le espres­sio­ni regolari:

import re

re.findall()

La funzione più im­por­tan­te per usare le RegEx in Python è in­dub­bia­men­te findall(). Riceve un modello di ricerca e una stringa Python e re­sti­tui­sce una lista Python di stringhe che contiene tutte le cor­ri­spon­den­ze nell’ordine in cui sono state trovate. Se non viene trovata nessuna oc­cor­ren­za, findall() re­sti­tui­sce una lista vuota.

Per il­lu­stra­re la funzione os­ser­via­mo questo esempio di codice:

import re
string = "python 3.0"
regex = "\D"
risultato = re.findall(regex, string)
print(risultato)
Python

Nel frammento di codice sopra, per prima cosa si importa il modulo re. Nella variabile chiamata “string” si inserisce poi la sequenza di caratteri “python 3.0”. Il modello di ricerca salvato nella variabile chiamata “regex”, che avete già visto nella tabella delle sequenze, trova tutti i caratteri che non sono cifre. Questo ab­bi­na­men­to è rea­liz­za­to con la funzione findall(), che come parametro di tra­sfe­ri­men­to riceve il modello di ricerca e la stringa da cercare. La lista generata viene inserita nella variabile chiamata “risultato” e re­sti­tui­ta sullo schermo chiamando la funzione print in Python. L’output si presenta come segue:

['p', 'y', 't', 'h', 'o', 'n', ' ', '.']

La lista contiene tutti i caratteri della stringa a eccezione delle cifre. Occorre tenere presente che anche uno spazio vuoto è con­si­de­ra­to un carattere e quindi compare all’interno della lista.

re.sub()

La funzione sub() so­vra­scri­ve tutte le cor­ri­spon­den­ze con un testo a vostra scelta. Come findall(), la funzione prende come primo parametro di tra­sfe­ri­men­to anche un’espres­sio­ne regolare. Il testo con cui so­sti­tui­re le cor­ri­spon­den­ze deve essere passato come secondo parametro di tra­sfe­ri­men­to. Il terzo parametro di tra­sfe­ri­men­to della funzione è la stringa da cercare. Se volete so­vra­scri­ve­re non tutte le cor­ri­spon­den­ze, ma soltanto un de­ter­mi­na­to numero, potete spe­ci­fi­ca­re come quarto parametro di tra­sfe­ri­men­to un numero che indichi quante cor­ri­spon­den­ze devono essere so­sti­tui­te a partire dalla prima.

Anche in questo caso è utile un esempio di codice per il­lu­stra­re il fun­zio­na­men­to:

import re
string = "python è un linguaggio fantastico"
regex = "\s"
risultato1 = re.sub(regex, "0", string)
print(risultato1)
risultato2 = re.sub(regex, "0", string, 2)
print(risultato2)
Python

Di nuovo, per prima cosa si importa re, poi si inserisce una sequenza di caratteri nella variabile “string”. Conoscete già il modello di ricerca da uti­liz­za­re: deve trovare tutti gli spazi in una stringa.

Seguono poi due chiamate simili di sub(): la prima chiamata deve so­sti­tui­re tutti gli spazi nella stringa passata con uno 0 e salvare il risultato nella variabile “risultato1”. La seconda chiamata limita il numero di spazi con il quarto parametro di tra­sfe­ri­men­to opzionale. Deve so­sti­tui­re i primi due spazi con uno 0 nella stringa passata e poi salvare il risultato nella variabile “risultato2”.

L’output del codice sopra si presenta quindi come segue:

'python0è0un0linguaggio0fantastico'
'python0è0un linguaggio fantastico'

re.split()

Come già si intuisce dal nome, split() del modulo re ricorda il fun­zio­na­men­to della funzione split() integrata in Python. Anch’essa divide una stringa in una lista. La stringa viene in­ter­rot­ta dopo ogni cor­ri­spon­den­za con un’espres­sio­ne regolare. Pertanto, non sorprende che la funzione si aspetti come primo parametro un modello di ricerca e come secondo parametro la stringa da dividere. Se volete dividere solo in modo limitato, potete passare un numero come terzo parametro opzionale, che determina il numero massimo di divisioni. Ri­cor­ria­mo di nuovo a un esempio pratico:

import re
string = "python è un linguaggio fantastico"
regex = "\s"
risultato1 = re.split(regex, string)
print(risultato1)
risultato2 = re.split(regex, string, 1)
print(risultato2)
Python

Conoscete gran parte del codice già dall’esempio pre­ce­den­te. Cambia soltanto la chiamata della funzione split(). Per prima cosa si chiama la funzione split() nella stringa, che deve essere divisa ogni volta che è presente uno spazio. Alla lista ri­sul­tan­te viene assegnata la variabile “risultato1”. La seconda chiamata split() limita il numero di divisioni indicate dal terzo parametro opzionale a 1 e assegna il risultato alla variabile chiamata “risultato2”. All’ese­cu­zio­ne del programma viene re­sti­tui­to il risultato seguente:

['python', 'è', 'un', 'linguaggio', 'fantastico']
['python', 'è un linguaggio fantastico']

re.search()

Come sug­ge­ri­sce il nome, la funzione search() cerca una cor­ri­spon­den­za in una stringa. A questo scopo riceve prima l’espres­sio­ne regolare e poi, come secondo parametro, la stringa in cui eseguire la ricerca. Re­sti­tui­sce un oggetto Match Python che si riferisce sempre alla cor­ri­spon­den­za pre­ce­den­te­men­te trovata. Se non viene trovata nessuna cor­ri­spon­den­za, la funzione re­sti­tui­sce il valore “None”. Anche questa volta un esempio aiuta a com­pren­de­re come lavora questa funzione:

import re
string = "python è un linguaggio fantastico"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx trovata.")
else:
	print("RegEx non trovata.")
Python

La funzione search() viene chiamata con un’espres­sio­ne regolare che cerca gli spazi e una stringa. L’oggetto Match re­sti­tui­to dalla chiamata della funzione viene salvato nella variabile “match”. La suc­ces­si­va istru­zio­ne if-else in Python aiuta a chiarire: se è stata trovata una cor­ri­spon­den­za, l’oggetto Match non è vuoto e viene se­le­zio­na­to il percorso if. Non sorprende che il programma fornisca l’output seguente:

'RegEx trovata.'

L’oggetto Match

L’oggetto Match è re­sti­tui­to da una chiamata search() e contiene in­for­ma­zio­ni sulle oc­cor­ren­ze trovate del modello di ricerca. A queste in­for­ma­zio­ni potete accedere con diverse funzioni:

  • object.start() fornisce l’indice del primo carattere della sot­to­strin­ga Python che cor­ri­spon­de al vostro modello di ricerca.
  • object.end(), ana­lo­ga­men­te a start(), re­sti­tui­sce l’indice dell’ultimo carattere.
  • object.span() unisce start() ed end(): la funzione re­sti­tui­sce una tupla Python che contiene il primo e l’ultimo indice della sot­to­strin­ga.
  • object.string re­sti­tui­sce la stringa ana­liz­za­ta.
  • object.re re­sti­tui­sce la RegEx Python che avete passato a search().

Per chiarire tutte queste funzioni, ag­giun­gia­mo chiamate di funzioni idonee all’ultimo esempio di codice:

import re
string = "python è un linguaggio fantastico"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx trovata.")
else:
	print("RegEx non trovata.")
print(match.start())
print(match.end())
print(match.span())
print(match.string)
print(match.re())
Python

L’output del programma si presenta come segue:

'RegEx trovata.'
6
7
(6, 7)
'python è un linguaggio fantastico'
re.compile('\\s')

In­nan­zi­tut­to viene re­sti­tui­ta la stringa “RegEx trovata.”, in quanto l’oggetto Match non è vuoto e quindi la con­di­zio­ne if è sod­di­sfat­ta. In seguito, viene vi­sua­liz­za­to l’indice della prima cor­ri­spon­den­za. Siccome il primo spazio ha l’indice “6”, il valore non sorprende. Lo stesso vale per il valore “7” che viene re­sti­tui­to a seguito della chiamata della funzione end(). La tupla “(6, 7)” unisce la chiamata di start() ed end(), indicando i due indici insieme. Anche l’output della stringa passata all’oggetto Match non stupisce.

Quindi cosa ha di speciale l’output “re.compile(’\s’)”? Si tratta di un oggetto RegEx in Python generato quando la stringa che avete passato come espres­sio­ne regolare viene elaborata come tale. Come vedete, tramite il vostro oggetto Match potete vi­sua­liz­za­re l’oggetto RegEx.

Vai al menu prin­ci­pa­le