Python: Guida all’uso delle espressioni regolari. re.compile

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Espressioni regolari in python

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)
⇒ 12
Il programma inizia importando il modulo per espressioni regolari di Python, 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.
Questa compilazione non è strettamente necessaria, ma le espressioni regolari compilate possono accelerare notevolmente la velocità di un programma e quindi vengono frequentemente utilizzate nei programmi che elaborano grande quantità di testi.
Per che cosa può essere utilizzata l’espressione regolare compilata da “amore”?
Potete utilizzarla per riconoscere le istanze della parola “amore” all’interno di un’altra stringa; in altre parole, potete utilizzarla per determinare se un’altra stringa contiene “amore” come sua sottostringa. Questo compito è svolto dal metodo search, che restituisce None nel caso in cui l’espressione regolare non venga trovata nell’argomento stringa.
Python interpreta None come False in un contesto booleano.
Se invece l’espressione regolare viene trovata nella stringa, Python restituisce un oggetto speciale che potete utilizzare per determinare varie caratteristiche della corrispondenza (per esempio il punto in cui si trova la stringa).

Uso dei  caratteri speciali nelle espressioni regolari

Forse potrebbe interessarti anche:  Le espressioni regolari (regex)

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)
⇒ 6
Il codice  precedente ha un piccolo difetto: conta quante righe contengono “solo” ignorando però le righe che contengono “Solo”, perché applica una distinzione rigida fra lettere maiuscole e minuscole.
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.
Al posto della seconda riga del programma, scrivete:
regexp = re.compile("solo|Solo")
⇒ 8
Questa espressione regolare utilizza il carattere speciale “barra verticale” |.
Un carattere speciale è un carattere che, in un’espressione regolare, non viene interpretato per quello che è, ma per un qualche significato speciale. In particolare, | significa OR e quindi questa nuova espressione regolare cerca “solo” oppure “Solo”.
Un altro modo per risolvere questo problema è il seguente:
regexp = re.compile("[sS]olo")
I caratteri speciali [ 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.