Python versione Bignami - Espressioni regolari
from re import *
Grammatica
.Un carattere qualsiasi, escluso\na meno chére.Snon sia attivo^L'inizio della stringa, o della riga sere.Mè attivo$La fine della stringa, o della riga serm.Mè attivo\AL'inizio della stringa\ZLa fine della stringa\bLa stringa vuota all'inizio o alla fine di una parola\BLa stringa vuota eccetto all'inizio e alla fine di una parola\dUna cifra tra 0 e 9\DTutto eccetto una cifra tra zero e 9\sUno spazio, andata a capo, tabulazione\STutto eccetto spazi, andate a capo, tabulazioni\wUna lettera maiuscola o minuscola, o un numero\WTutto eccetto lettere maiuscole o minuscole o numeri- regexp
*regexp ripetuta 0 o piú volte, cercando di fare la stringa piú lunga possibile - regexp
+regexp ripetuta 1 o piú volte, cercando di fare la stringa piú lunga possibile - regexp
?regexp oppure nulla, cercando di fare la stringa piú lunga possibile - regexp
{m,n}regexp ripetuta un minimo di m e un massimo di n volte, cercando di fare la stringa piú lunga possibile *?,+?,??Come*,+,?e{m,n}, ma cercando di fare la stringa piú corta possibile[abcd]uno qualsiasi dei caratteri nell'elenco.[a-z]tra a e z. Per mettere il trattino nell'elenco, metterlo come primo o ultimo caratterei (per esempio:[abcd-])[^abcdA-Z]tutti i caratteri eccetto quelli nell'elenco\escape dei caratteri speciali- regexp1
|regexp2 regexp1 oppure regexp2 (regexp)raggruppa regexp (a|b*è diverso da(a|b)*). Ricorda la stringa matchata dall'espressione tra parentesi per potervi accedere dopo il match- \numero matcha la stessa stringa precedentemente matchata dal gruppo numero numero. La numerazione parte da 1.
(?:regexp)come le parentesi, ma senza ricordare la stringa matchata(?P<nome>regexp)come le parentesi, ma ricorda la stringa matchata dandole il nome nome(?P=nome)ripetizione della stringa precedentemente matchata col nome nome.(?=regexp)match di regexp, ma senza spostarsi avanti nella stringa dopo il match(?!regexp)versione negata di(?=regexp).(?<=regexp)fa match se esiste una stringa matchata da regexp che termina esattamente alla posizione corrente(?<!regexp)versione negata di(?<=regexp).(?(nome)regexp1|regexp2)se un gruppo(?P<nome>)è stato matchato in precedenza, allora fa match di regexp1, altrimenti di regexp2*.(?#...)Un commento dentro l'espressione, che viene ignorato.(?flag)dove flag è una o piú delle lettere 'i', 'L', 'm', 's', 'u' o 'x', setta il corrispondente flag re.I, re.L, re.M, re.S, re.U o re.X per l'intera espressione.
Flag che cambiano il comportamento di un'espressione regolare
re.Inon fa distinzione tra maiuscole e minuscolere.Ladatta\w,\W,\be\Balla lingua correntere.Mquando una stringa contiene piú righe, '^' e '$' fanno match anche di inizio e fine rigare.S'.' matches ALL chars, including newlinere.Uadatta\w,\W,\be\Bper lavorare usando le proprietà Unicode dei caratterire.Xignora gli spazi e le andate a capo eccetto tra le parentesi quadre, permettendo di formattare espressioni complesse in maniera piú leggibile
Match al volo
mo = match(pattern, string[, flags])vero se il pattern fa match all'inizio della stringa. Restituisce unMatchObject, o None se non fa match.mo = search(pattern, string[, flags])vero se il pattern fa match in un punto qualsiasi della stringa. Restituisce unMatchObject, o None se non fa match.lista = split(pattern, string[, maxsplit=0])divide la stringa considerando come separatori tutti i pezzetti di stringa su cui l'espressione fa match. Sepatternusa le parentesi, restituisce anche i pezzetti di stringa corrispondenti al pattern tra parentesi.lista = findall(pattern, string)restituisce una lista con tutte le parti della stringa che fanno match conpattern. Sepatternusa le parentesi, restituisce tuple con le stringhe corrispondenti ai pattern tra parentesi.s = sub(pattern, repl, string[, count=0])restituisce una stringa dove tutte le parti che fanno match conpatternsono sostituite darepl
Creazione
- r = compile(pattern[, flags]) compila il pattern e restituisce un oggetto di tipo espressione regolare
Oggetti di tipo espressione regolare
mo = r.match(string[, flags])vero se r fa match all'inizio della stringa. Restituisce unMatchObject, o None se non fa match.mo = r.search(string[, flags])vero se r fa match in un punto qualsiasi della stringa. Restituisce unMatchObject, o None se non fa match.lista = r.split(string[, maxsplit=0])divide la stringa considerando come separatori tutti i pezzetti di stringa su cui r fa match. Sepatternusa le parentesi, restituisce anche i pezzetti di stringa corrispondenti al pattern tra parentesi.lista = r.findall(string)restituisce una lista con tutte le parti della stringa che fanno match con r. Sepatternusa le parentesi, restituisce tuple con le stringhe corrispondenti ai pattern tra parentesi.s = r.sub(repl, string[, count=0])restituisce una stringa dove tutte le parti che fanno match con r sono sostituite darepl
Oggetti di tipo MatchObject
mo.group(0)restituisce tutta la stringa matchatamo.group(1)restituisce la stringa matchata dal primo gruppo tra parentesimo.group(1, 3, 4)restituisce una tupla con le stringhe matchate dal primo, terzo e quarto gruppo tra parentesimo.gruop("nome")restituisce la stringa matchata dal gruppo(P<nome>...)groups()restituisce una tupla con tutti i gruppi matchati
Trucchi utili
r"stringa"definisce una stringa in cui non vengono espansi i backslash: è molto utile per definire un'espressione regolare.- re.escape(stringa) restituisce una stringa in cui tutti i caratteri che hanno un'interpretazione speciale nell'espressione regolare vengono protetti da backslash: è utile per fare match esatto di stringhe arbitrarie
Esempi
import re
# Divide una stringa usando virgole come separatori, ma tollerando spazi
# attorno alle virgole
lista = re.split(r'\s*,\s*', stringa)
# Stampa tutte le righe di un file che iniziano con la stringa data
r = re.compile('^'+re.escape(sys.argv[1]))
for line in file:
if r.match(line):
print line[:-1]
# Legge un file saltando commenti e linee vuote
r = re.compile(r"^(?:\s*|#.+)$")
for line in file:
if r.match(line):
continue
# ...
# Fa il parse di un file di configurazione
r = re.compile(r"^\s*(\w+)\s*=\s*(.+?)\s*$")
for line in file:
mo = r.match(line)
if mo:
key, val = mo.group(1, 2)
# Nasconde le password
re.sub(r"^(Password:\s*).+$", r'\1(nascosto)', stringa)
# Scambia pezzi di stringa
re.sub(r"(\w+)\s*=\s*(\w+)", r'\2 = \1', stringa)