|
|
|
La libreria di riferimento di Python |
|
|
|
4.2.1 Sintassi delle espressioni regolari
Un'espressione regolare (comunemente abbreviata in RE, dall'Inglese
Regular Expression) specifica un insieme di stringhe che vi
corrispondono; le funzioni in questo modulo permettono di controllare
se una particolare stringa corrisponde ad una data espressione
regolare (o se una data espressione regolare corrisponde ad una data
stringa, che poi è la stessa cosa).
Le espressioni regolari possono venire concatenate per formare una
nuova espressione regolare; se A e B sono entrambe
espressioni regolari, allora anche AB è un'espressione regolare.
In generale, se una stringa p corrisponde ad A e un'altra
stringa q corrisponde a B, la stringa pq
corrisponderà ad AB. Questo è vero meno che A o B
contengano operazioni a bassa precedenza, condizioni al contorno tra
A e B, o abbiamo riferimenti di gruppo numerati. Così,
espressioni complessse possono facilmente venire costruite partendo da
espressioni primitive più semplici, come quelle descritte qui. Per i
dettagli sulla teoria e l'implementazione delle espressioni regolari,
consultate il libro di Friedl (vedete il riferimento sopra) o un
qualsiasi libro sulla creazione di compilatori.
Qui di seguito si troverà una breve spiegazione sul formato delle
espressioni regolari. Per maggiori informazioni e una spiegazione più
particolareggiata, consultate l'HOWTO sulle Espressioni Regolari,
accessibile all'URL http://www.python.org/doc/howto/.
Le espressioni regolari possono contenere sia caratteri speciali che
ordinari. Caratteri più ordinari singoli, come "A",
"a", o "0", sono le espressioni regolari più
semplici; semplicemente corrispondono a se stessi. Potete concatenare
i caratteri ordinari, così last corrisponde alla stringa
'last'
. (Nel resto di questa sezione, scriveremo le
espressioni regolari in questo modo particolare, generalmente
senza quotatura, e le stringhe da corrispondere tra
'virgolette'
.)
Alcuni caratteri, come "|" o "(", sono speciali.
I caratteri speciali possono indicare sia classi di carattere
ordinarie, sia modificatori dell'interpretazione delle espressioni
regolari indicate da questi.
I caratteri speciali sono:
- "."
- (Punto, in inglese "dot"). Nella modalità
predefinita, questo corrisponde a qualunque carattere, ad
eccezione del fine riga. Se l'opzione DOTALL viene
specificata, il punto corrisponde a qualunque carattere, fine riga
compreso.
- "^"
- (Cappelletto, in inglese "caret").
Corrisponde all'inizio di una stringa, e nella modalità
MULTILINE corrisponde anche all'inizio di ogni nuova
riga, ovvero dopo ogni carattere di fine riga.
- "$"
- Corrisponde alla fine della stringa o prima del
carattere di fine riga alla fine della stringa; nella modalità
MULTILINE corrisponde prima di ogni fine riga.
foo corrisponde sia a 'foo' che a 'foobar', mentre
l'espressione regolare foo$ corrisponde solo a 'foo'.
L'espressione regolare foo.$ in 'foo1\
nfoo2\n' restituisce la corrispondenza 'foo2'
normalmente, ma 'foo1' nella modalità MULTILINE.
- "*"
- Fa sì che l'espressione regolare risultante
corrisponda a 0 o più ripetizioni della precedente espressione
regolare, un numero qualunque di ripetizioni è possibile.
ab* corrisponde ad 'a', 'ab' o 'a' seguita da qualunque
numero di 'b'.
- "+"
- Fa sì che l'espressione regolare risultante
corrisponda a 1 o più ripetizioni della precedente espressionre
regolare. ab+ corrisponderà ad 'a' seguita da un
qualunque numero, diverso da zero, di 'b'; non corrisponde alla
stringa 'a'.
- "?"
- Fa sì che l'espressione regolare risultante
corrisponda a 0 o 1 ripetizioni della precedente espressione
regolare. ab? corrisponderà sia ad 'a' che ad 'ab'.
*?
, +?
, ??
- I qualificatori "*",
"+" e "?" sono ingordi; corrispondono a
tutto il testo possibile. A volte questo comportamento non è
quello desiderato; se l'espressione regolare <.*> viene
fatta corrispondere alla stringa
'<H1>title</H1>'
,
corrisponderà all'intera stringa e non solo a '<H1>'
.
Aggiungere il carattere "?" dopo il qualificatore rende
la ricerca delle corrispondenze non non-ingorda o
minimale; verrà fatto corrispondere il minor numero
possibile di caratteri. Usando .*? nella precedente
espressione vi sarà corrispondenza solamente con '<H1>'
.
{m}
- Specifica che devono corrispondere esattamente m copie della
precedente espressione regolare; un numero minore di corrispondenze
farà sì che l'intera espressione regolare non corrisponda. Per
esempio, a{6} corrisponderà esattamente con sei caratteri
"a", ma non con cinque.
{m,n}
- Fa sì che la risultante espressione
regolare corrisponda da m a n ripetizioni
dell'espressione regolare precedente, cercando di far
corrispondere più ripetizioni possibili. Per esempio,
a{3,5} corrisponderà da tre a cinque caratteri
"a". Omettendo m si specifica un limite inferiore
di zero e omettendo n si specifica un limite superiore
infinito. Come esempio a{4,}b corrisponderà con
aaaab
o con un migliaio di caratteri "a" seguiti
da una b
, ma non ad aaab
. La virgola non dovrebbe
venire omessa, o il modificatore potrebbe venire confuso con la
forma descritta in precedenza.
{m,n}?
- Fa sì che l'espressione regolare
risultante corrisponda da m a n ripetizioni della
precedente espressione regolare, cercando di far corrispondere il
minor numero di ripetizioni possibili. Questa è la versione
non ``ingorda'' del precedente qualificatore. Per esempio, nella
stringa di 6 caratteri
'aaaaaa'
, a{3,5}
farà corrispondere cinque caratteri "a", mentre
a{3,5}? farà corrispondere solo tre caratteri.
- "\"
- Utilizzato sia come sequenza di escape per i
caratteri speciali (consentendo la corrispondenza di caratteri come
"*", "?" e così via), sia per segnalare una
sequenza speciale; le sequenze speciali vengono discusse di
seguito.
Se non state utilizzando una stringa raw per rappresentare
il modello, ricordatevi che Python usa anche i backslash come una
sequenza di escape nelle costanti letterali; se la
sequenza di escape non viene riconosiuta dal parser di Python, il
backslash ed i caratteri seguenti vengono inclusi nella stringa
risultante. Tuttavia, nel caso in cui se Python riconoscesse la
sequenza risultante, il backslash dovrebbe venire ripetuto due
volte. Questo è complicato e difficile da comprendere, perciò è
altamente raccomandato che utilizziate sempre le stringhe raw,
tranne che per le espressioni più semplici.
[]
- Vengono utilizzate per indicare un insieme di
caratteri. I caratteri possono venire elencati individualmente, o
un intervallo di caratteri può venire indicato fornendo due
caratteri separati da un trattino ("-"). I caratteri
speciali non sono attivi all'interno degli insiemi.
Per esempio, [akm$] corrisponderà ognuno dei caratteri
"a", "k", "m" o "$";
[a-z] corrisponderà a tutte le lettere minuscole, e
[a-zA-Z0-9]
corrisponderà ad ogni lettera o cifra. Le
classi di caratteri come \w
o \S
(definite di
seguito) sono anche acettabili all'interno di un intervallo.
Se voleste includere un carattere "]" o "-" in
un insieme, fatelo precedere da un backslash o indicatelo come primo
carattere dell'intervallo. Il modello []] corrisponderà
alla stringa ']'
, per esempio.
Potete far corrispondere i caratteri non compresi in un determinato
intervallo. Questo viene indicato includendo il carattere
"^" come primo carattere dell'insieme;
"^" altrove corrisponderà semplicemente con
il carattere "^". Per esempio,
[^5] corrisponderà con ogni carattere
escluso "5", e
[^^
] corrisponderà con
ogni carattere eccetto "^".
- "|"
A|B
, dove A e B possono essere espressioni
regolari arbitrarie, crea un'espressione regolare che corrisponderà
ad A o a B. Un numero arbitrario di espressioni regolari possono
venire separate dal carattere "|" in questo modo. Può
venire utilizzato anche all'interno dei gruppi (vedete di seguito).
Come la stringa bersaglio viene analizzata, le espressioni regolari
vengono provate da sinistra a destra. Quando un modello corrisponde
completamente, quel ramo viene accettato. Questo significa che
quando A
corrisponde, B
non verrà testata, anche se
dovesse avere una corrispondenza maggiore. In altre parole,
l'operatore "|" non è mai ``ingordo''. Per far
corrispondere una costante "|", utilizzate \|,
oppure inseritela in una classe di caratteri, come in [|].
(...)
- Fa corrispondere qualunque espressione regolare
nelle parentesi, e indica l'inizio e la fine di un gruppo; i
contenuti di un gruppo possono venire recuperati dopo che una
corrispondenza viene verificata, e possono essere nuovamente fatte
corrispondere nella stringa con la sequenza speciale \
numero, descritta di seguito. Per far corrispondere le
costanti "(" o ")", utilizzate \( o
\) oppure inseritele in una classe di caratteri:
[(] [)].
(?...)
- Questa è una notazione di estensione (un
"?" che segue un "(" non ha significato,
altrimenti). Il primo carattere dopo "?" determina il
significato e l'ulteriore sintassi del costrutto. Le estensioni
normalmente non creano un nuovo gruppo;
(?P<nome>...) è la sola eccezione a questa regola.
Di seguito vengono indicate le estenzioni attualmente supportate.
(?iLmsux)
- (Una o più lettere dall'insieme "i",
"L", "m", "s", "u",
"x".) Il gruppo corrisponde la stringa vuota;
l'insieme delle lettere impostano le opzioni corrispondenti
(re.I, re.L, re.M,
re.S, re.U, re.X) per l'intera
espressione regolare. Questo è utile se volete includere le
opzioni come parte dell'espressione regolare, invece che
passarle come argomento di opzione alla funzione
compile().
Notate che il flag (?x) cambia il modo di analizzare
l'espressione. Dovrebbe venire all'inizio della stringa modello, o
dopo uno o più caratteri di spaziatura. Se ci sono dei caratteri
non di spaziatura prima dell'opzione, i risultati sono indefiniti.
(?:...)
- Una versione delle parentesi che non indica un
gruppo. Fa corrispondere qualsiasi espressione regolare contenuta
tra parentesi, ma la sotto stringa corrisposta dal gruppo
non può venire recuperata dopo aver soddisfatto una
corrispondenza, e non può successivamente venire
referenziata nel modello.
(?P<name>...)
- Simile alle parentesi regolari, ma
la sotto stringa corrispondente al gruppo è accessibile attraverso
il gruppo simbolico name. I nomi dei gruppi devono essere
identificatori validi in Python, ed ogni nome di gruppo deve venire
definito solo una volta in un'espressione regolare. Un gruppo
simbolico è anche un gruppo numerato, come se il gruppo non fosse
nominato. Perciò il gruppo chiamato 'id' nell'esempio sottostante
può anche venire riferito come il gruppo numerato 1.
Per esempio, se il modello è (?P<id>[a-zA-Z_]\w*), il
gruppo può venire riferito dal suo nome, negli argomenti ai
metodi degli oggetti corrispondenti, come m.group('id')
o
m.end('id')
, e anche attraverso il nome nel testo del
modello (per esempio, (?P=id) ed il testo di sostituzione
(come \g<id>
).
(?P=name)
- Fa corrispondere qualunque testo
precedentemente corrisposto, ad un gruppo chiamato name.
(?#...)
- Un commento; il contenuto delle parentesi viene
semplicemente ignorato.
(?=...)
- Corrisponde se ... corrisponde
successivamente, ma non consuma nessun carattere della stringa.
Viene chiamata asserzione di lookahead (NdT: letteralmente "guarda
avanti"). Per esempio, Isaac (?=Asimov) corrisponderà
con
'Isaac '
solo se seguito da 'Asimov'
.
(?!...)
- Corrisponde se ... non corrisponde
successivamente. Questa è un'asserzione di lookahead negativa. Per
esempio, Isaac (?!Asimov) corrisponderà ad
'Isaac '
solo se non seguito da 'Asimov'
.
(?<=...)
- Corrisponde se la posizione corrente nella
stringa viene preceduta da una corrispondenza per ... che
termina esattamente alla posizione corrente. Questa viene
chiamata un'asserzione di lookbehind positiva.
(?<=abc)def troverà un corrispondenza in "abcdef",
perché il lookbehind controllerà i 3 caratteri predecenti e
verificherà se esiste corrispondenza con il modello contenuto.
Il modello contenuto deve solo corrispondere stringhe di una data
lunghezza fissa, questo significa che abc o a|b
vengono ammesse, ma a* e a{3,4} no. Notate che
i modelli che iniziano con un'asserzione di lookbehind positiva non
corrisponderanno mai all'inizio della stringa cercata; desidererete
molto probabilmente usare la funzione search() piuttosto
che la funzione match():
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
Questo esempio cerca una parola preceduta da un trattino:
>>> m = re.search('(?<=-)\w+', 'spam-egg')
>>> m.group(0)
'egg'
(?<!...)
- Corrisponde se la posizione corrente nella
stringa non viene preceduta da una corrispondenza per ....
Questa viene chiamata asserzione di lookbehind negativa.
Similmente all'asserzione di lookbehind positiva, il modello
contenuto può solo essere una stringa a lunghezza fissa. I
modelli che iniziano con un'asserzione di lookbehind negativa
possono corrispondere all'inizio della stringa ricercata.
(?(id/name)yes-pattern|no-pattern)
- Proverà a
corrispondere con yes-pattern se il gruppo con il dato
id o il name indicato esiste, e con no-pattern
se non esiste. |no-pattern è opzionale e può venire
omesso.
Per esempio, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>) è un
semplice sistema di corrispondenza per gli indirizzi e-mail, che
corrisponderà con
'<user@host.com>'
e
'user@host.com'
, ma non con '<user@host.com'
.
Nuovo nella versione 2.4.
Le sequenze speciali consistono di "\" e di un carattere
dalla lista seguente. Se il carattere ordinario non è nella lista,
l'espressione regolare risultante corrisponderà al secondo
carattere. Per esempio, \$ corrispondere al carattere
"$".
\number
- Fa sì che corrisponda il contenuto del
gruppo con lo stesso numero. I gruppi vengono numerati a partire
da 1. Per esempio, (.+) \1 corrisponde a
'the the'
o a '55 55'
, ma non a 'the end'
.
(notate lo spazio dopo il primo gruppo). Questa sequenza speciale
può venire utilizzata soltanto per far corrispondere uno dei primi
99 gruppi. Se la prima cifra di number è 0, o se il
number è di 3 cifre ottali, non verrà interpretato come una
corrispondenza su un gruppo, ma come il carattere corrispondente al
numero espresso in valore ottale.
Tra i caratteri "[" e "]" di una classe di
caratteri, tutti gli escape numerici vengono trattati come
caratteri.
\A
- Corrisponde solo all'inizio della stringa.
\b
- Fa sì che corrisponda la stringa vuota, ma solo
all'inizio o alla fine di una parola. Una parola viene definita
come una sequenza di caratteri alfanumerici e underscore, perciò la
fine di una parola viene indicata da un carattere di spaziatura, o
un carattere che non sia nè alfanumerico nè un underscore. Notate
che
\b
viene definito come il contorno tra \w
e
\W
, così il preciso insieme di caratteri alfanumerici
dipende dai valori delle opzioni UNICODE
e LOCALE
.
All'interno di un intervallo di caratteri, \b
rappresenta il carattere di backspace, per compatibilità con le
stringhe costanti di Python.
\B
- Corrisponde alla stringa vuota, ma solo quando
non si trova all'inizio o alla fine di una parola. Questo
è l'opposto di
\b
, quindi è anche esseo soggetto alle
impostazioni di LOCALE
e UNICODE
.
\d
- Corrisponde ogni cifra decimale; è equivalente
all'insieme [0-9].
\D
- Corrisponde qualsiasi carattere che non sia una
cifra; è equivalente all'insieme [^0-9].
\s
- Fa sì che corrisponda ogni carattere di spaziatura;
è equivalente all'insieme [ \t\n\r\f\v].
\S
- Fa sì che corrisponda ogni carattere che non sia di
spaziatura; è equivalente all'insieme
[^ \t\n\r\f\v].
\w
- Quando le opzioni LOCALE e
UNICODE non vengono specificate, corrisponde a qualsiasi
carattere alfanumerico e di trattino basso; questo è equivalente
all'insieme [a-zA-Z0-9_]. Con LOCALE, farà
corrispondere l'insieme [0-9_] più qualsiasi carattere
definito come alfanumerico nella localizzazione corrente. Se
UNICODE è impostato, questo farà corrispondere i
caratteri [0-9_] più qualunque carattere classificato
come alfanumerico nel database delle proprietà dei caratteri
Unicode.
\W
- Quando le opzioni LOCALE e
UNICODE non vengono specificate, fa corrispondere
qualsiasi carattere non alfanumerico; questo è equivalente
all'insieme [^a-zA-Z0-9_]. Con
LOCALE, farà corrispondere ogni carattere non presente
nell'insieme [0-9_] e non definito come alfanumerico,
nella localizzazione corrente. Se UNICODE è impostato,
questo farà corrispondere qualsiasi cosa, tranne [0-9_] e
i caratteri segnati come alfanumerici nel database delle proprietà
dei caratteri Unicode.
\Z
- Corrisponde solo alla fine della stringa.
La maggior parte degli escape standard supportati dalle stringhe
costanti Python vengono anche accettati dall'analizzatore delle
espressioni regolari:
\a \b \f \n
\r \t \v \x
\\
Gli escape ottali vengono inclusi in una forma limitata: se la prima
cifra è uno 0, o ci sono tre cifre ottali, viene considerato un escape
ottale. Altrimenti è il riferimento ad un gruppo.
|
|
|
La libreria di riferimento di Python |
|
|
|
Release 2.3.4, documentation updated on 21. maggio 2005.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.