Cosa sono le Regex
Espressioni Regolari
› Un’espressione regolare (regular expression o regex) è una sequenza di caratteri che identifica un insieme di stringhe.
› Sono un potente strumento che consente di trovare, estrarre e sostituire parti di testo all’interno di un documento.
Esempi di regex
[-+]?[0-9]+
Trova tutti i numeri interi con segno.
^.*\.txt$
Trova tutti i file che hanno estensione txt.
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Trova gli indirizzi IPv4.
^4[0-9]{12}(?:[0-9]{3})?$
Trova numeri di carte di credito.
Le regex più semplici
› Nella loro forma più semplice, una regex è una sequenza di caratteri alfanumerici.
› abc ad esempio, trova la stringa ‘abc’.
› Le espressioni regolari, di norma, sono case sensitive. La regex di prima infatti troverà la stringa ‘abc’, ma non la stringa ‘Abc’ o ‘aBc’.
› Le regex possono, tramite regole opportune, trovare qualsiasi carattere, compresi gli altri caratteri ASCII (‘~’, ‘|’) e persino quelli Unicode (‘è’,’①’, ‘⼦’).
› Bisogna tuttavia porre attenzione al fatto che alcuni caratteri hanno una funzione particolare nel linguaggio delle regex.
Quantificatore *
Detto anche stella di Kleene, serve per trovare famiglie di stringhe che hanno da 0 a N ripetizioni di uno stesso carattere.
ab*c → {‘ac’, ‘abc’, ‘abbc’, ‘abbbc’, …}
I quantificatori si riferiscono sempre al carattere immediatamente precedente.
Quantificatori + e ?
+
Identico a *, ma le ripetizioni ammesse sono da 1 a N, e non da 0 a N.
ab+c → {‘abc’, ‘abbc’, ‘abbbc’, …}
?
Ammette l’opzionalità del carattere precedente (può essere presente 0 o 1 volta).
ab?c → {‘ac’, ‘abc’}
Operatore \
\
Effettua l’escaping del carattere precedente, se esso è un carattere particolare.
a** → Non valida
a\** → {‘a’, ‘a*’, ‘a**’, ‘a***’, …}
a*\* → {‘*’, ‘a*’, ‘aa*’, ‘aaa*’, …}
a\*\* → {‘a**’}
a\c → Non valida
a\\c → {‘a\c’}
Gruppi
› In realtà non è vero che gli operatori si applicano al carattere precedente: è più corretto dire che si applicano al token precedente.
› Un token, nel caso più semplice, è un carattere, ma può essere anche un gruppo o una classe di caratteri.
› In particolare, un gruppo di caratteri è una stringa delimitata dalle parentesi tonde.
a(bc)*d → {‘ad’, ‘abcd’, ‘abcbcd’, …}
› Nell’esempio precedente, il token su cui è applicata la stella di Kleene è (bc).
› L’ordine dei caratteri all’interno del gruppo è importante!
a(cb)*d → {‘ad’, ‘acbd’, ‘acbcbd’, …}
Operatore|
Specifica alternative all’interno di un gruppo.
gr(a|e)y → {‘gray’, ‘grey’}
In un gruppo possono essere presenti più alternative in qualsiasi ordine, e le alternative sono stringhe di qualsiasi lunghezza.
(cla|repl|gu)y → {‘clay’, ‘reply’, ‘guy’}
È inoltre possibile specificare la stringa vuota come alternativa:
(na|)y → {‘y’, ‘nay’}
Classi
› Esiste un modo più pratico per trovare alternative di singoli caratteri, ossia definire una classe di caratteri.
› Una classe di caratteri è un insieme non ordinato di caratteri in alternativa tra di loro delimitato da parentesi quadre.
› La regular expression gr(a|e)y può essere dunque riscritta come:
gr[ae]y → {‘gray’, ‘grey’}
› I quantificatori visti finora perdono di significato se sono inseriti all’interno di una classe, eccetto l’operatore \.
a[-+*\\]b → {‘a+b’, ‘a-b’, ‘a*b’, ‘a\b’}
› Una classe di caratteri è anche essa un token su cui è possibile applicare un quantificatore.
a[cd]?b → {‘ab’, ‘acb’, ‘adb’}
› Lo spazio è un carattere ammesso.
a[ _]b → {‘a_b’, ‘a b’}
Intervalli
Il carattere – definisce un intervallo di caratteri all’interno di una classe.
Esso è utilizzabile solamente per definire intervalli di caratteri alfanumerici, sia uppercase che lowercase: se usato singolarmente si comporta come un normale carattere.
1[0-4] → {’10’, ’11’ , ’12’ , ’13’ , ’14’}
[A-Za-z]* → una qualsiasi sequenza di lettere
[+-]?17 → {’17’, ‘+17′ ,’-17′}
Negazione
regex escludere caratteri
Il carattere ^, se posto all’inizio di una classe, specifica che la classe rappresenta i caratteri che NON devono essere presenti.
Perde questo significato se è non è il primo carattere di una classe.
1[^0-4] → {’15’, ’16’ , ‘1a’ , ‘1T’ , …}
a[&^|]b → {‘a&b’, ‘a^b’ ,’a|b’}
Classi speciali
espressione regolare: escludere “a capo”
.
Trova qualsiasi carattere eccetto il newline ‘\n’.
. → {‘a’, ‘b’ , ‘4’ , ‘&’ , …}
\d
Trova caratteri numerici. Include [0-9] ma anche tutti i caratteri non-ASCII riconducibili a numeri.
\d → {‘0’, ‘1’ , ‘2’ , ‘3’ ,’𝟘’, …}
\s
Trova whitespace. Include [ \t\n\r\f\v] e tutti i caratteri whitespace speciali Unicode.
\w
Trova caratteri alfanumerici. Include [A-Za-z0-9_] ma anche tutti i caratteri non-ASCII riconducibili a numeri o lettere.
\w → {‘a’, ‘T’ , ‘9’ , ‘è’ ,’①’, ‘_’, …}
› Esistono anche le classi duali di \d, \w, e \s, e sono rispettivamente \D, \W, \S.
› Esse trovano esattamente i caratteri complementari alle classi base:
– \D trova tutti i caratteri che non sono numeri.
– \W trova tutti i caratteri che non sono numeri né lettere.
– \S trova tutti i caratteri non whitespace.
\W → {‘#’, ‘[‘ , ‘+’ , ‘.’ ,’€’, …}
› Le classi speciali \d, \w, e \s, e le loro duali possono essere utilizzate all’interno di altre classi.
[\daB] → {‘0’, ‘1’ , ‘2’ , … , ‘a’, ‘B’}
› Il punto all’interno di una classe invece vale sempre e solo come carattere, non come classe.
[^.] → tutti i caratteri tranne ‘.





(165)
Altri articoli nella categoria "Le espressioni regolari - Regex"
- Miglioriamo l’ algoritmo di riconoscimento dell’ironia
- Regex. Alcuni esempi in python
- Le espressioni regolari. Tecniche di ricerca testuale
- Python: Le regex: uso dei metacaratteri
- Python: Guida alle espressioni regolari: le funzioni re.search, re.findall e re.finditer
- Python: le espressioni regolari (regex). Classi di negazione