L’italiano è fatto di parole (manualetto di regular expressions)

Posted on 11 novembre 2008

1


Quando dovete scrivere, cercare o manipolare parole (oppure pasticciare con Google Analytics), lo strumento più potente a vostra disposizione sono le espressioni regolari (in inglese regular expressions oppure regexp o regex).
Si tratta di una sintassi con cui esprimere in modo formale le condizioni che il testo cercato deve soddisfare.

“Dammi tutte le righe di testo dove appare un numero che può andare da uno a trentuno seguito da un trattino, una barra o un punto, seguiti da un altro numero (da uno a dodici, questa volta) seguiti ancora da un trattino, una barra o un punto, e seguiti infine da un numero di quattro cifre”… Sì, stiamo descrivendo il formato di una data.
Le espressioni regolari sono questo: un modo per descrivere la forma di ciò che stiamo cercando.

Una sintassi, però, non è uno strumento software: per usare le regexp occorre identificare quegli strumentiche le supportino per offrire all’utente migliori funzionalità di ricerca e di sostituzione di parti di testo.

La prima versione di questo post proponeva alcuni esercizi da fare con i comandi grep e sed, nati nel mondo Unix ma utilizzabili anche per Windows. Scrivevo:

Scaricate il file UnxUtils.zip da Sourceforge.net; se non volete scaricare direttamente da questo link (o se il link non dovesse più funzionare) andate alla pagina http://sourceforge.net/projects/unxutils e seguite le istruzioni per il download.
All’interno del file zip troverete due file HTML e due directory. Seguite il percorso usr > local > wbin. Di tutti i file EXE scegliete grep.exe e sed.exe: per ora possono bastare. Copiateli e incollateli all’interno della directory “Windows” che trovate sotto “C:” (oppure metteteli dove vi pare e poi aggiungete una variabile d’ambiente che punti al percorso che avete scelto: in entrambi i casi il risultato è che potrete richiamare i 2 eseguibili usando semplicemente il loro nome senza dover specificare percorso ed estensione).
Adesso aprite una consolle: Start > Esegui. Digitate “cmd“. Questa consolle sarà il giocattolo con cui impareremo ad usare le regular expressions.

Mi sono tuttavia reso conto che le differenze di sintassi tra il grep per Windows e il grep per Unix rischiavano di confondere le idee. Così ora vi propongo di utilizzare un altro strumento con cui fare i vostri esercizi di espressioni regolari: SciTE, ovvero Scintilla Text Editor.

Scaricate l’installer (oppure il solo eseguibile) e fate poi partire Scite: vi trovere di fronte ad un editor testuale davvero minimale.

Interfaccia dell'editor testuale SciTE

Interfaccia dell'editor testuale SciTE

A questo punto possiamo scrivere le parole “Primo esperimento di testo” e poi effettuare una ricerca (premendo contemporaneamente il tasto Control (Ctrl) e la lettera “F”); sinceratevi di aver spuntato la voce “regular expression”, dopo di che cercate semplicemente la parola “primo”.

La finestra della ricerca sparisce, così che voi possiate muovervi tramite il tasto “F3” tra le diverse occorrenze di quanto avete cercato (beh, in questo caso non vi muoverete affatto, visto che ce n’è una sola); per far apparire nuovamente la finestra premete di nuovo contemporaneamente il tasto Control (Ctrl) e la lettera “F”.

La finestra di ricerca dell'editor SciTE

La finestra di ricerca dell'editor SciTE

Ecco, possiamo cominciare a fare i nostri esperimenti con le espressioni regolari.

Testo “Primo esperimento con le regular expression”; Cerchiamo “primo”

L’editor trova un’occorrenza poiché il nostro testo contiene i caratteri “p”, “r”, “i”, “m”, “o” in questa precisa sequenza (e non abbiamo chiesto di considerare rilevante il fatto che siano stati scritti in maiuscolo o in minuscolo).

Testo “Primo esperimento con le regular expression”; Cerchiamo “mento”

L’editor trova un’occorrenza poiché il nostro testo contiene i caratteri “m”, “e”, “n”, “t”, “o” in questa precisa sequenza.

Testo “Primo esperimento con le regular expression”; Cerchiamo “\bmento”

L’editor NON trova alcuna occorrenza poiché il nostro testo contiene i caratteri “m”, “e”, “n”, “t”, “o” in questa precisa sequenza, ma prima di essi il testo presenta altri caratteri… mentre noi abbiamo chiesto che il nostro testo cominciasse per “mento”: è questo il significato del word boundary \b. Prima ci può essere uno spazio, un segno di punteggiatura oppure l’inizio della riga: l’importante è che non vi sia un altro carattere.
Qui le cose si fanno interessanti, perché cominciamo a poter identificare parole, non solamente sequenze di caratteri.

Testo “Primo esperimento con le regular expression”; Cerchiamo “\bexpres\b”

L’editor NON trova alcuna occorrenza perché abbiamo chiesto espressamente la parola “expres”, e non semplicemente la sequenza di caratteri “expres”. La nostra ricerca significa infatti: “trovami un inizio di parola, la sequenza di caratteri ‘e’, ‘x’, ‘p’, ‘r’, ‘e’, ‘s’ e poi una fine di parola”. Notate che il word boundary “\b” può valere sia per l’inizio di parola che per la fine di parola.

Testo “Primo esperimento con le regular expression”; Cerchiamo “pr.mo.es”

L’editor trova un’occorrenza poiché abbiamo chiesto alcune lettere, alcune delle quali non specificate. E’ questo l’utilizzo del “carattere universale” punto: significa “qualsiasi carattere”, e di fatto nel nostro caso andava bene per corrispondere ad una “i” e ad uno spazio.

Testo “Primo esperimento con le regular expression”; Cerchiamo “/bpr[io]mo/b”

L’editor trova un’occorrenza perché abbiamo chiesto che nel testo fossero presenti le parole “primo” oppure “promo”, ovvero una parola che differisca solamente per la sua prima vocale: le parentesi quadrate permettono di specificare tutte le varianti ammesse, così da non dover utilizzare un troppo generico punto (che corrisponde invece a qualsiasi carattere: anche una consonante, un numero, una punteggiatura…). Provate a vedere se il pattern “\bpr[io]mo\b” trova corrispondenze nella frase “premo un bottone”; e ora fate in modo che il vostro pattern valga anche per questo caso…

Testo “Primo esperimento con le regular expression”; Cerchiamo “\bexpres+ion\b”

Stiamo chiedendo che il testo contenga la parola (inesistente) “expresion” e, nello specifico, permettiamo che questa venga scritta con un numero imprecisato di “s”. Il significato del carattere “più”, difatti, è quello di indicare quante volte può essere ripetuto il carattere che lo precede: nello specifico significa “da una a infinite volte”. Vi ricordate la pubblicità in cui il fanciullo si presentava alla fanciulla con un “Buonaseeeeraaaa”? Per trovare le corrispondenze di quella parola, indipendentemente dal numero di “e” e di “a” utlizzate, sarà sufficiente cercare la parola “\bbuonase+ra+\b”.

Testo “Primo esperimento con le regular expression”; Cerchiamo “\bprimo?\b”

Anche il punto di domanda è un carattere “di quantità”, ovvero indica quante volte può comparire il carattere che lo precede. In questo caso sta per “da zero o una volta”: la “o” può esserci oppure no, e in entrambi i casi la nostra ricerca è vera.

Continuerò gli esempi in un prossimo post. Fino ad allora, buone sperimentazioni.

Vedremo anche questo esempio: come identificare tutte le parole che contengono una o più lettere doppie...

Vedremo anche questo esempio: come identificare tutte le parole che contengono una o più lettere doppie...