Aiuto:Espressioni regolari

Da Wikipedia, l'enciclopedia libera.
Abbreviazioni
WP:Regex

Scopo di questa pagina di aiuto è riassumere brevemente la sintassi da usare nella creazione di algoritmi per la sostituzione automatica di testo (correzioni ortografiche, stilistiche e così via) all'interno delle pagine di Wikipedia.

Istruzioni[modifica | modifica wikitesto]

I typos possono essere segnalati ricorrendo al formalismo delle espressioni regolari (regex), che consente di listare in maniera sintetica le parole errate e le relative correzioni. Il modo più immediato per creare una lista di espressioni è il seguente

(expr1|expr2|...exprN)expr

in sostanza, il tool ricerca nel testo tutte le occorrenze delle N espressioni dichiarate (ossia, expr1expr, expr2expr etc.) e svolge l'operazione associata, che potrebbe essere ad esempio sostituire a quelle occorrenze un valore predefinito. Se le espressioni sono semplici caratteri, si può usare la scrittura più sintetica

[char1char2...charN]expr

la scrittura opposta è la seguente

[^char1char2...charN]expr

e forza la ricerca nel testo di tutte le occorrenze di espressioni del tipo char#expr, dove char# è un qualunque carattere diverso da char1, char2 etc. Si noti che un'espressione non deve per forza essere un carattere o una stringa di testo, ma può anche essere a sua volta una lista. Ad esempio, la scrittura

(a|[bc])

è lecita, ed equivale a [abc], cioè a tutte le occorrenze delle lettere a, b e c. Nello stesso modo, (Ric|[Cc])onoscenza corrisponde alle parole Riconoscenza, Conoscenza e conoscenza.

Quantificatori[modifica | modifica wikitesto]

Oltre ai suddetti metodi, esistono vari quantificatori che permettono di semplificare la scrittura delle liste.

Un quantificatore è un simbolo che va messo a destra di una determinata espressione, e genera una lista di espressioni. Per convenzione, un quantificatore opera sul carattere o sulla sequenza di escape che lo precede.

I principali quantificatori sono

  • ? (zero or one) sta indicare il fatto che l'espressione cui si riferisce può anche non essere presente. In pratica, la scrittura expr? equivale a (|expr) (si osservi che il primo campo è un'espressione vuota, che corrisponde al carattere vuoto)
  • * (zero or some) sta indicare il fatto che l'espressione cui si riferisce può non essere presente, o essere presente una o più volte. expr* equivale quindi a (|expr|exprexpr|exprexprexpr|...)
  • + (one or some) sta indicare il fatto che l'espressione cui si riferisce può essere presente una o più volte. expr+ equivale quindi a scrivere l'espressione (expr|exprexpr|exprexprexpr|...)

Inoltre, può tornare utile la notazione {n , m} che va a seguire un carattere o una parentesi chiusa, dove la n sta per "ripetuto almeno n volte", e la m sta per "ripetuto alpiù m volte".

I quantificatori, per default, sono greedy, cioè quando vengono usati per trovare un'espressione in un testo tendono a individuare quella più lunga possibile. Ad esempio, la regex b+ nel testo bbbbbbbbbbB trova la stringa bbbbbbbbbb, mentre la regex (B|b)+ trova la stringa bbbbbbbbbbB.
Possono però essere resi lazy facendoli seguire dal punto interrogativo ?: in questo modo, la regex bb+?b → c nel solito testo si fermerà all'espressione più corta possibile, che è costituita da tutti i gruppi formati da tre b consecutive restituendo cccb. Questo equivale ovviamente a quello che fa la regex bbb → c; l'uso della modalità lazy diventa conveniente quando viene usata ad esempio insieme ai caratteri di formattazione.

Esempi
  • find="\bAccell?erazzione\b" replace="Accelerazione": trova nel testo tutte le occorrenze di Accelerazzione e Accellerazzione e le sostituisce con il termine corretto Accelerazione
  • find="\bAccell?eraz+ione\b" replace="Accelerazione": esegue la stessa operazione di prima, ma corregge anche parole quali Accellerazione, Accellerazzzione etc.
  • z{3} individua la lettera "z" ripetuta esattamente 3 volte
  • z{3 ,} individua la lettera "z" ripetuta almeno 3 volte
  • z{3 , 6} individua la lettera "z" ripetuta fra 3 e 6 volte

Nota: \b sta ad indicare un word boundary, cioè un limitatore di parola, e non va riscritto nel campo replace (è replicato in automatico), che comunque in generale non accetta caratteri di formattazione.

Sequenze di escape[modifica | modifica wikitesto]

Le parentesi tonde non vengono mai interpretate come caratteri, perché servono a definire le sequenza di escape, cioè insiemi di caratteri e operatori come potrebbe essere la scrittura ((a|b)[cd]f?), corrispondente alle stringhe di testo acf adf bcf bdf ac ad bc bd. Se invece si vuole usare le parentesi (e in generale qualunque carattere speciale, come ^, ? o le parentesi quadre) come caratteri da ricercare nel testo, basta farle precedere dal carattere backslash, così \(, \) (cfr. il paragrafo Ricerca dei simboli speciali).

Tutte le sequenza di escape vengono numerate automaticamente e possono poi essere richiamate con il simbolo $# (dove #=1,2...) quando si specifica la correzione da fare. La numerazione procede dall'esterno verso l'interno, e da sinistra verso destra; ad esempio

(a | (b | c) ­| (d | e) ) (s | (f | (d | 8) ) )
1 4
2 3 5
6

se si intende impedire la numerazione di una parentesi, perché non si intende richiamarla, si deve inserire il simbolo ?: dopo la prima

(a | (b | c) ­| (?:d | e) ) (s | (f | (d | 8) ) )
1 3
2 4
5
Esempi
  • find="\b(A|a)ccellerare\b" replace="$1ccelerare": trova nel testo tutte le occorrenze di Accellerare e accellerare e le sostituisce rispettivamente con Accelerare e accelerare
  • find="\b(A|a)ccellera(re|zione)\b" replace="$1ccelera$2": la stessa correzione di prima, ma opera anche sul corrispondente sostantivo
  • find="\b(A|a)cce(?:l+)era(?:zz?ione)\b" replace="$1ccelerazione": questo codice corregge la l multipla e la doppia z
  • find="(E|e)f(f?)icente" replace="$1f$2iciente": sostituisce parole quali Efficente e deficente con i termini corretti (Efficiente e deficiente)

Nota: se si vuole richiamare l'espressione [char1char2...charN], o [^char1char2...charN], è necessario metterla tra parentesi. Nel primo caso si può, anzi è preferibile, semplificare la notazione scrivendo (char1|char2|...charN) invece che ([char1char2...charN]).

Lookaround[modifica | modifica wikitesto]

Lookaround Lookahead Lookbehind
Positivo (?<=) (?=)
Negativo (?<!) (?!)

Un'altra modalità d'uso delle sequenze di escape è la funzione lookaround, che permette di escludere alcune parti dalla sostituzione. Essa si ottiene facendo seguire al punto interrogativo alcuni caratteri, nel seguente modo

find="(?<=expr1)espressione(?=expr2)" replace="nuova espressione": sostituisce espressione con nuova espressione, ma solo se la prima si trova tra expr1 e expr2 (lookaround positivo)
find="(?<!expr1)espressione(?!expr2)" replace="nuova espressione": sostituisce espressione con nuova espressione, ma solo se la prima non è né preceduta da expr1 né seguita da expr2 (lookaround negativo)

è ovviamente possibile combinare tra di loro lookaround positivi e negativi, e usarli singolarmente a precedere o a seguire l'espressione da sostituire.

Quantificatori e sequenze di escape[modifica | modifica wikitesto]

Un quantificatore opera sempre sul carattere o sulla sequenza di escape che lo precede. Se quest'ultima viene richiamata, il valore restituito corrisponde sempre all'ultimo carattere memorizzato, procedendo da sinistra verso destra. Ad esempio, la regex (B|b)+ → $1 sostituisce la stringa bbbbbbbbbbB con il carattere B.

Esempi
  • find="(Q|q)+" replace="$1": rimpiazza tutte le q maiuscole o minuscole ripetute con un unico carattere[1]

Caratteri di formattazione[modifica | modifica wikitesto]

  • \n individua una nuova linea
  • \t individua un carattere di tabulazione
  • \r individua un ritorno carrello
  • . individua un generico carattere, ad eccezione del ritorno carrello. Il match del ritorno carrello può comunque essere attivato specificando la modalità singleline
  • \b limitatore di parola
  • \B individua un qualunque carattere che non sia un limitatore di parola
  • \s individua un carattere di spaziatura (spazio, \n, \t o \r)
  • \S individua un qualunque carattere che non sia un carattere di spaziatura
  • \w individua un carattere di parola (lettera, digit o underscore)
  • \W individua un qualunque carattere che non sia un carattere di parola
  • \d individua un digit (da 0 a 9)
  • \D individua un qualunque carattere che non sia un digit
  • - inserito tra due caratteri (lettere o cifre) e tra parentesi quadre (es. [A-H]) individua qualunque carattere che sia compreso nell'intervallo tra i suddetti (è ammessa anche la notazione [A-Ha-h])
  • \p{nome} individua un carattere singolo incluso nel blocco denominato o nella categoria generale Unicode specificata in "nome" (es. \p{IsCyrillic} individua un carattere dell'alfabeto cirillico)
  • \P{nome} individua un carattere singolo non incluso nel blocco denominato, né nella categoria generale Unicode specificata in "nome"

Ricerca dei simboli speciali[modifica | modifica wikitesto]

Se nel testo da ricercare è incluso un simbolo speciale, basta farlo precedere da un backslash per fargli perdere la sua funzione di carattere di formattazione. Ad esempio, se si vuole cercare "F.I.G.C.", basterà scrivere find="F\.I\.G\.C\." ed il punto non starà più ad indicare un generico carattere, ma indicherà esattamente ed unicamente il carattere punto fermo.

Questi sono i caratteri che hanno necessariamente bisogno di essere preceduti dal backslash per essere ricercati come tali:

. [ ] ( ) \ | ? * + ^ $

Tuttavia, per evitare ambiguità con il linguaggio delle regex, è consigliato adottare tale metodo di ricerca anche quando si vuole cercare uno dei seguenti caratteri:

, { } - ! < = :

Note[modifica | modifica wikitesto]

  1. ^ Questa correzione va sempre bene in italiano, con la sola eccezione della parola soqquadro

Bibliografia[modifica | modifica wikitesto]

Pagine correlate[modifica | modifica wikitesto]

Collegamenti esterni[modifica | modifica wikitesto]