Limitare la golosità nelle espressioni regolari in Python
Le espressioni regolari sono per impostazione predefinita golose. Ciò significa che catturano il numero massimo possibile di caratteri. Analizziamo con un esempio. Supponiamo di avere la seguente stringa:
txt = 'aeeex zzz x kkk'
In questa stringa vogliamo trovare la sottostringa
'aeeex' utilizzando il seguente modello:
lettera 'a', poi qualsiasi carattere
una o più volte, poi la lettera 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Anche se ci aspettiamo di ottenere la stringa '! zzz
x kkk', verrà stampata la stringa '! kkk'.
Il punto è che la nostra regex cerca
tutti i caratteri dalla lettera 'a' alla lettera
'x'. Ma nella nostra stringa ci sono due lettere
'x'! A causa della golosità, risulta che
la regex cerca fino all'ultima 'x',
catturando così ciò che non ci serviva.
Certo, spesso è proprio questo comportamento che ci serve. Ma in questo caso specifico è necessario disattivare la golosità e dire alla regex di cercare fino alla prima 'x'. In questo caso bisogna mettere un punto interrogativo dopo l'operatore di ripetizione:
res = re.sub('a.+?x', '!', txt)
print(res) # stamperà la stringa '! zzz x kkk'
La golosità può essere limitata per tutti gli operatori
di ripetizione: sia *, che ?, e
{} - in questo modo: *?, ??
e {}?.
Data la stringa:
txt = 'aba accca azzza wwwwa'
Scrivi un'espressione regolare che trovi tutte
le stringhe ai cui estremi ci sono le lettere
'a', e sostituisca ciascuna di esse con
'!'. Tra le lettere 'a' può
esserci qualsiasi carattere (tranne 'a').