Trattino all'interno di set nelle espressioni regolari Python
Il trattino è anch'esso un carattere speciale all'interno di [ ]
(ma all'esterno - no). Se avete bisogno del trattino stesso
come carattere - mettetelo in una posizione
dove non verrà interpretato come separatore
di un intervallo.
Perché è importante: potreste creare un intervallo
di caratteri senza accorgervene. Ad esempio,
così - '[:-@]' - pensate di selezionare
il due punti, il trattino e la chiocciola, mentre
in realtà ottenete l'intervallo di caratteri tra
: e @. In questo intervallo rientrano
i seguenti caratteri: ? < = > :
Da dove vengono? Dalla tabella ASCII - il due punti ha un numero inferiore alla chiocciola - e quindi si forma un intervallo. Cioè tutti gli intervalli sono determinati secondo la tabella ASCII (volendo ci si può fare affidamento).
Come risolvere il problema: posizionate il carattere
trattino dove sicuramente non verrà interpretato
come carattere di intervallo, ad esempio, all'inizio o
alla fine (cioè dopo [ o prima di
]).
Si può anche escape il trattino - in questo caso
indicherà sé stesso indipendentemente
dalla posizione. Ad esempio, invece di [:-@]
scrivere [:\-@] - e non ci sarà più l'intervallo,
ma ci saranno tre caratteri - il due punti,
il trattino e la chiocciola @.
Esempio
Nel seguente esempio il modello di ricerca è questo:
cifra 1, poi una lettera da 'a'
a 'z', poi cifra 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Risultato dell'esecuzione del codice:
'! 1-2 ! !'
Esempio
Ora escape il trattino. Di conseguenza
il modello di ricerca è questo: cifra
1, poi lettera 'a', o
trattino, o lettera 'z', poi cifra
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Risultato dell'esecuzione del codice:
'! ! 1c2 !'
Esempio
Si può semplicemente spostare il trattino, senza escape arlo:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Risultato dell'esecuzione del codice:
'! ! 1c2 !'
Esempio
Nel seguente esempio il modello di ricerca è questo:
il primo carattere è una lettera minuscola o
un trattino '-', poi due lettere
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Risultato dell'esecuzione del codice:
'! Axx ! @xx'
Esempio
Nel seguente esempio il modello di ricerca è questo:
il primo carattere è una lettera minuscola, maiuscola
o un trattino '-', poi due lettere
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Risultato dell'esecuzione del codice:
'! ! ! @xx'
Esempio
Si può posizionare il trattino tra due intervalli - lì sicuramente non creerà un altro intervallo:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Risultato dell'esecuzione del codice:
'! ! ! @xx'
Problemi pratici
Data la stringa:
txt = 'xaz xBz xcz x-z x@z'
Trovate tutte le stringhe secondo il seguente modello:
lettera 'x', lettera maiuscola o minuscola
o trattino, lettera 'z'.
Data la stringa:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Trovate tutte le stringhe secondo il seguente modello:
lettera 'x', poi o dollaro, o
trattino o più, poi lettera 'z'.