Le espressioni regolari
Le espressioni regolari sono implementate da un unico modulo Python e sono un argomento talmente avanzato che non fanno neanche parte della libreria standard di linguaggi del calibro di C o Java. Ma se utilizzate Python, probabilmente vi troverete sicuramente a fare molta elaborazione di testi ed in questo caso, le espressioni regolari sono troppo utili per poter essere ignorate.
Che cos’è un’espressione regolare?
Un’espressione regolare (regex) è un modo per individuare e spesso estrarre dei dati da determinate sequenze di testo. Una regex che riconosce un frammento di testo o una stringa si dice che ha trovato una corrispondenza (match) con tale testo o stringa. Una regex è definita da una stringa in cui determinati caratteri (metacaratteri) hanno un significato speciale, il che consente a una singola regex di individuare anche più stringhe differenti.
ESEMPIO
È più facile comprendere questo discorso attraverso un esempio.
Ecco dunque un programma con un’espressione regolare che conta quante righe di un file di testo contengono la parola hello.
Useremo il testo di ” Una canzone d’amore ” di Max Pezzali per effettuare il conteggio delle ricorrenze della parola “amore”.
Una riga che contiene la parola ‘amore più volte viene contata una sola volta:
import re
regexp = re.compile("amore")
count = 0
file = open("/content/una canzone d'amore.txt", 'r')
for line in file.readlines():
if regexp.search(line):
count = count + 1
file.close()
print(count)
re
. Poi prende la stringa di testo “amore” come espressione regolare testuale e la compila a formare una espressione regolare compilata utilizzando la funzione re.compile
. search
, che restituisce None
nel caso in cui l’espressione regolare non venga trovata nell’argomento stringa.Uso dei caratteri speciali nelle espressioni regolari
Facciamo un altro esempio. Cerchiamo ora la parola “solo” che si presta meglio a quello che andremo a vedere.
import re
regexp = re.compile("solo")
count = 0
file = open("/content/una canzone d'amore.txt", 'r')
for line in file.readlines():
if regexp.search(line):
count = count + 1
file.close()
print(count)
Un modo per risolvere questo problema consisterebbe nell’utilizzare due espressioni regolari, una per “solo” e una per “Solo”, ed eseguire il test di entrambe su ogni singola riga. Un modo migliore consiste nel cominciare a utilizzare le funzionalità più avanzate delle espressioni regolari.
regexp = re.compile("solo|Solo")
regexp = re.compile("[sS]olo")
[
e ]
considerano i caratteri che includono e cercano una corrispondenza con unsingolo carattere della stringa. C’è anche una particolare abbreviazione per individuare intervalli di caratteri fra [ e ]; per esempio [a-z]
individua un singolo carattere compreso fra a e z, [0-9A-Z]
individua qualsiasi cifra o carattere maiuscolo e così via. Talvolta occorre anche includere il simbolo di trattino fra le parentesi quadre, nel qual caso dovrà essere specificato come primo carattere, per evitare di definire un intervallo; quindi, per esempio, [-012]
individua un trattino, uno 0, un 1 oppure un 2 e niente altro.