Espressioni Regolari

Linguistica Computazionale
Laboratorio
espressioni regolari (2)
09 ottobre 2014
Esercizi

Formalizzare con le espressioni regolari i
patterns per trovare le seguenti stringhe:

“tutte le vocali minuscole o maiuscole“
Esercizi (1)

"le parole che iniziano per consonante“:


“le parole che terminano con un segno di
punteggiatura (es. "cane," "finito;" ecc.)”:


r‘\s[qwrtupsdfghjklzxcvbnm]\w*|\s[QWRTYPSDFGHJKL
ZXCVBNM]\w*‘
r'\w+[,;.:?!]\s‘
“Il passato prossimo del verbo mangiare“

r‘\sho\smangiato|\shai\smangiato|\sha\smangiato|\sabbi
amo\smangiato|\savete\smangiato|\shanno\smangiato|\
sHo\smangiato|\sHai\smangiato|\sHa\smangiato|\sAbbia
mo\smangiato|\sAvete\smangiato|\sHanno\smangiato‘
Esercizi (2)

“le parole che iniziano per ‘tar’ o per ‘tr’”:


“le date in cui giorno, mese e anno sono tutti
espressi da numeri“:



r‘\star\w*|\str\w*’
r‘\s\d\d[-/]\d\d[-/]\d\d\d\d‘
r‘\s[0-3]?\d[-/][01]?\d[-/][0-2]?\d?\d?\d\s'
Usando l’operatore di sostituzione
"verticalizzate” le parole, in modo che ogni
parola venga scritta su una riga diversa:

NuovaFrase=re.sub(r‘ ’, r‘\n’, frase)
Wildcard

La RE r‘.’ corrisponde a qualsiasi carattere (eccetto
il ritorno-a-capo)
RE
Definizione
Esempi di “matching”
r’b.s’
qualsiasi stringa di tre
caratteri che inizia con ‘b’ e
termina con ‘s’
“bas” “bbs” “b3s” “b!s” “b s”
“b,s” …
qualsiasi stringa che inizia
per b e termina per s
“bs” “bas” “bbs” “b3s” “b!s” “b s”
“b,s” “baas”
r’b.*s’
“baas”
“bisogna prendere l’autobus”
r‘.*’
qualsiasi stringa (compresa
quella vuota)
una intera riga di testo
Ingordigia e pigrizia

I moltiplicatori in Python sono ingordi (greedy)

fanno sempre matching con la stringa più lunga possibile
r’x+’
“axxxxxxxb” “axxxxxxxb”
r’a.*c’

“a xxx c xxx c xxx d”
“a xxx c xxx c xxx d”
E’ possibile rendere i moltiplicatori “pigri” (lazy) facendoli
seguire dal carattere “?”

fanno matching con la stringa più corta possibile
r’a.*?c’ “a xxx c xxx c xxx d”
“a xxx c xxx c xxx d”
Raggruppamento e memoria

Le parentesi tonde (seguite dai simboli ‘?:’) servono per
raggruppare stringhe di caratteri da moltiplicare:
RE
Definizione
Esempi di “matching”
r’(?:ab)+’
una o più stringhe “ab”
“ab” “abab” “ababab”
r’ab+’
una “a” seguito da una o più “b”
“ab” “abb” “abbb”
Le parentesi tonde (senza ‘?:’) memorizzano la stringa di
testo corrispondente al contenuto delle parentesi:
- la stringa viene memorizzata in una variabile temporanea
- Il contenuto della variabile può essere richiamato con \<numero>
- 1 = contenuto della prima coppia di parentesi; 2 = contenuto della
seconda coppia di patentesi, ecc.
Raggruppamento e memoria
RE
Definizione
Esempi di “matching”
r’((?:ab)+)\1’
la variabile “\1” corrisponde a
qualunque stringa abbia fatto matching
con il contenuto delle parentesi
“abab”
“abababab”
“abababababab”
r’(a+)(b+)\1\2’
r’p(.)o p\1o’
r’p.o p.o’
la variabile “\1” corrisponde a
qualsiasi stringa abbia fatto matching
con il contenuto della prima coppia di
parentesi; la variabile “\2” idem, ma
rispetto alla seconda coppia di
parentesi
“abab”
“abbabb”
“aabaab”
“abbaab”
la variabile “\1” corrisponde a
qualunque stringa abbia fatto matching
con il contenuto delle parentesi
“pio pio” “pao pao” “pro pro”,
ecc.
la wildcard “.” può essere sostituita da
qualsiasi carattere
“pio pio” “pio pao” “pro pso”,
“pao pio”, ecc.
“pio pao” “pao peo”
Raggruppamento e memoria:
Esercizi

“Il passato prossimo del verbo mangiare”:

Invece di:
r‘\sho\smangiato|\shai\smangiato|\sha\smangiato|\sabbi
amo\smangiato|\savete\smangiato|\shanno\smangiato|\
sHo\smangiato|\sHai\smangiato|\sHa\smangiato|\sAbbi
amo\smangiato|\sAvete\smangiato|\sHanno\smangiato‘

possiamo scrivere:
r‘\s(?:ho|hai|ha|abbiamo|avete|hanno|Ho|Hai|Ha|
Abbiamo|Avete|Hanno)\smangiato‘

oppure
r‘\s(?:[hH](?:o|ai|a|anno)|[Aa](?:bbiamo|
vete))\smangiato‘
Raggruppamento e memoria:
Esempio di sostituzione in Python

Sostituire il segno ‘-’ con il segno ‘/’all’interno delle date
espresse utilizzando soli numeri:

Input:
17/10/2013, 17-10-2013, 30-05-77, 40-12-2013

Output: 17/10/2013, 17/10/2013, 30/05/1977, 40-12-2013
Caratteri speciali

Alcuni caratteri hanno un significato speciale nel linguaggio
delle RE


[]?*. ()+-/{}
Se questi caratteri fanno parte del pattern di testo da cercare,
devono comparire in una RE con davanti il carattere ‘\’
(carattere di escape)

r’[a’

r‘\[a’
r‘a.’
r‘a\.’
r‘cane?’
r‘cane\?’




ERRORE! ‘[‘ è interpretato come classe di carattere e
manca la parentesi ‘]’
la stringa “[a”
qualsiasi stringa di due caratteri che inizia con ‘a’ “ab” “au” “a1” “a?” …
la stringa di testo “a.”
le stringhe “cane” e “can”
la stringa “cane?”
Ancore

Le ancore sono caratteri speciali che specificano dove deve
comparire il pattern di testo da cercare


‘^<pattern>’ il <pattern> deve comparire all’inizio di una linea
‘<pattern>$’ il <pattern> deve comparire alla fine di una linea
RE
Definizione
Esempi di “matching”
r‘cane$’
la stringa ‘cane’ quando
compare alla fine di una
linea
“…cane¶”
r’^La’
r’^La Spezia$’
“il cane di Mario”
la stringa ‘La’ quando
compare all’inizio di una
linea
“¶La macchina era guasta”
una riga che contiene solo
la stringa “La Spezia”
“¶La Spezia¶”
“il treno per La Spezia”
“…a La Spezia per lavoro …”
Ancore

“\b” è un ancora che indica il confine di una parola (“\B” indica
ogni punto non confine di parola)

Il confine di una parola è un punto che ha da una parte un carattere di
classe \w e dall’altra o un carattere di classe \W o l’inizio (fine) riga
¶
La macchina in giardino
RE
Definizione
Esempi di “matching”
r‘\bcane\b’
la stringa ‘cane’ deve avere
a destra e a sinistra un
confine di parola
“il cane è …”
r‘\Bcane\b’
la stringa ‘cane’ deve avere
a destra (ma non a sinistra)
un confine di parola
“il canestro” “le americane sono”
“il cane è …”
“il canestro” “le americane sono”
Precedenza

I moltiplicatori, le parentesi, l’alternativa, le ancore
sono operatori


permettono di costruire RE complesse a partire da altre RE
Esistono delle regole di precedenza tra gli operatori

r‘a|b+’
Parentesi
Moltiplicatori
Sequenze e ancore
Alternativa

()
? * + {m,n}, ecc.
ata ^ $ \b
|
Le parentesi ( ) permettono di alterare l’ordine di
precedenza
r’a|b+’
vs.
r‘(?:a|b)+’
Esercizi


Formalizzare con le espressioni regolari i patterns per trovare le seguenti stringhe
(NB: parola = sequenza di caratteri separati da spazi o ritorni a capo)

"Tutti i numeri con o senza punto o virgola (es. 10.000; 0,56; 45; ecc.)“

“Le parole in fondo ad una linea di testo che terminano per sto o per sito“

“I punti di fine frase che compaiono in fondo ad una linea di testo“

“Gli acronimi di almeno 2 lettere maiuscole con le lettere separate da punti (es.
U.S.A.)“

“I numeri formati da una cifra pari e una dispari alternata (es. 21, 234, 4896, ecc.)“

“Le linee di testo che terminano con una lettera maiuscola“

“L'imperfetto indicativo di amare, sia con la lettera minuscola che con la maiuscola“
(presentare la soluzione più sintetica)
Usando l’operatore di sostituzione:

nelle date con il mese scritto a lettere, sostituire gli spazi con l'underscore (es. 25
marzo 2003 diventa 25_marzo_2003)

separare con uno spazio le parentesi e le virgolette dalla parola (es mare, e (casa)
diventano mare , e ( casa ) )

trasformate i numeri invertendo la prima cifra con l’ultima (es: 123456 diventa
623451)

trasformate tutte le parole del testo che iniziano per vocale invertendo il primo
carattere con l'ultimo (es alto diventa olta)