() translation by (you can also view the original English article)
Vi siete mai chiesti qual'è la chiave per trovare una stringa di testo in un documento, o essere sicuri che un testo sia conforme a qualche formato, come per esempio un indirizzo email, o altre operazioni simili?
La chiave per effettuare queste operazioni è regular expressions (regex). Vediamo alcune definizioni per le regular expressions (espressioni regolari). In Wikipedia, una regex è definita come:
Una sequenza di caratteri che definisce un pattern di ricerca, principalmente usato per trovare corrispondenze con e tra le stringhe, come per esempio nelle operazioni di "trova e sostituisci". Il concetto è nato negli anni '50 quando il matematico americano Stephen Kleene propose una descrizione formale per un linguaggio regolare; vennero comunemente utilizzate nei sistemi Unix negli editors, nei programmi grep e nei filtri.
Un'altra bella definizione, presa da regular-expressions.info, è:
Una regular expression (regex o regexp in breve) è una stringa speciale di testo che definisce un pattern di ricerca. Si può pensare alle espressioni regolari come a caratteri jolly. Probabilmente hai famigliarità con la notazione wildcard come *.txt per cercare tutti i files di testo nel file manager. La regex equivalente è .*\.txt$
So benissimo che il concetto di regular expression può sembrare un pochino vago. Andiamo a guardare qualche esempio per chiarire meglio il concetto.
Esempi di Regular Expressions
In questa sezione vi mostrerò alcuni esempi di regex per aiutarvi a comprenderle meglio.
Mettiamo il caso che abbiate questa regex:
1 |
/abder/ |
Questa ci dice semplicemente di estrarre solamente la parola abder
.
E questa regex?
1 |
/a[nr]t/ |
Puoi leggere la regex come segue: trova nel testo tutte le parole la cui prima lettera sia a
e l'ultima sia t
, e tra la prima e l'ultima sia presente almeno o n
o r
. Estraiamo le parole ant
e art
.
A questo punto ti faccio un piccolo quiz. Come si scriveresti un'espressione regolare che parte con ca
e termina con almeno uno dei caratteri tbr
? Questa regex può essere scritta come segue:
1 |
/ca[tbr]/ |
Se vedi una regex che parte con il simbolo di accento circonflesso ^
, significa di trovare le stringhe che partono con i valori che seguono il simbolo ^
. Così, se usassi la regex precedente, estrarrei le stringhe che iniziano con This
.
1 |
/^This/ |
Perciò, nella seguente stringa:
1 |
My name is Abder |
2 |
This is Abder |
3 |
This is Tom |
Basandoci sulla regex /^This/
, verrebbero trovate le seguenti stringhe:
1 |
This is Abder |
2 |
This is Tom |
Se avessimo voluto estrarre tutte le stringhe terminanti con qualche stringa? In questo caso usiamo il carattere dollaro $
. Ecco un esempio:
1 |
Abder$
|
Così, se applichiamo questa regex alla stringa precedente (costituita dalle tre righe), otterremo:
1 |
My name is Abder |
2 |
This is Abder |
Bene, cosa pensi adesso di questa regex?
1 |
^[A-Z][a-z] |
Lo sò, di primo acchito sembra complicata, ma lasciami continuare e ti guiderò passo dopo passo.
Sappiamo che cosa sia l'accento circonflesso ^
. Significa estrarre tutte le stringhe che partono con la stringa data. [A-Z]
si riferisce a tutte le lettere maiuscole. Così, se leggi questa parte della regex: ^[A-Z]
, ci dice di trovare tutte le stringhe che iniziano con una lettera maiuscola. L'ultima parte, [a-z]
, significa che dopo aver trovato le stringhe che iniziano con una lettera maiuscola, devono necessariamente esser seguite da una lettera dell'alfabeto minuscola.
Quindi, quale delle seguenti stringhe saranno trovate con la seguente regex? Se non sei sicuro, puoi usare Python come mostrato nella prossima sezione per dare una risposta alla tua domanda.
1 |
abder |
2 |
Abder |
3 |
ABDER |
4 |
ABder |
Le Regular Expression sono un argomento veramente vasto e questi esempi servono ad accennarti come e per cosa sono usate.
Un buon riferimento per imparare molto di più sulle espressioni regolari e vedere molti esempi è RexEgg .
Regular Expressions in Python
Adesso arriva la parte divertente. Vogliamo vedere come si lavora in Pytohn con alcune delle espressioni regolari precedenti. Il modulo per lavorare con le espressioni regolari in Python è re
.
Il primo esempio consisteva nel trovare la parola abder
. In Python possiamo farlo come segue:
1 |
import re |
2 |
text = 'My name is Abder' |
3 |
match_pattern = re.match(r'Abder', text) |
4 |
print match_pattern |
Se esegui lo script quì sopra di Python, otterrai il seguente output: None
!
Lo script lavora bene, ma il problema è come lavora la funzione match ()
. Se ritorniamo alla documentazione del modulo re
, questo è quello che la funzione match ()
fà:
Se zero o più caratteri all'inizio della stringa del pattern dell'espressione regolare sono trovati, ritorna l'oggetto della corrispondenza trovata. Ritorna None se il pattern non trova la stringa; da notare che è differente dal trovare una stringa di lunghezza zero.
Aha, possiamo notare che la funzione match ()
ritornerà un oggetto solo se trova la stringa del pattern all'inizio della stringa in cui si cerca.
Possiamo utilizzare la funzione search ()
, come possiamo trovare nella documentazione:
Scansiona tra le stringhe per trovare la prima occorrenza del pattern della regular expression e ritorna l'oggetto della corrispondenza trovata. Ritorna il valore None se non trovi nessuna occorrenza del pattern; notare che è differente dal trovare una stringa di lunghezza zero in qualche punto.
Così, se riscriviamo lo script precedente, usando search ()
al posto di match ()
, otterremo il seguente output:
<_sre.SRE_Match object at 0x101cfc988>
Cioè sarà ritornato l'oggetto match object
.
Se vuoi come dati di ritorno il risultato (string match), usa la funzione group ()
. Se invece vuoi vedere tutti gli elementi trovati, usa group(0)
. In questo modo:
print match_pattern.group(0)
Ritornerà il seguente output: Abder
.
Se riprendiamo la seconda regex del paragrafo precedente, ossia /a[nr]t/
, può essere scritta in Python come segue:
1 |
import re |
2 |
text = 'This is a black ant' |
3 |
match_pattern = re.search(r'a[nr]t', text) |
4 |
print match_pattern.group(0) |
L'output di questo script è: ant
.
Conclusioni
L'articolo stà diventando piuttosto lungo e l'argomento delle espressioni regolari in Python è un compito che richiede più di un articolo, se non un libro intero.
Questo articolo, comunque, vuole essere un trampolino di lancio nel mondo delle espressioni regolari in Python. Puoi fare riferimento alla documentazione del modulo re
per imparare moltissimo su questo modulo ed approfondire questo argomento.