A kapzsiság korlátozása reguláris kifejezésekben Pythonban
A reguláris kifejezések alapértelmezetten kapzsiak. Ez azt jelenti, hogy a lehető legtöbb karaktert próbálják megragadni. Nézzünk egy példát. Tegyük fel, hogy van egy ilyen karakterláncunk:
txt = 'aeeex zzz x kkk'
Ebben a karakterláncban meg szeretnénk találni
a
'aeeex' részt a következő minta alapján:
az 'a' betű, majd bármely karakter
egy vagy többször, majd az 'x' betű:
res = re.sub('a.+x', '!', txt)
print(res)
Bár a '! zzz
x kkk' karakterláncot várnánk, a '! kkk'
karakterlánc jelenik meg.
Ennek az az oka, hogy a reguláris kifejezésünk
az 'a' betűtől az 'x' betűig
keresi az összes karaktert.
De a karakterláncunkban két 'x' betű van!
A kapzsiság miatt az történik, hogy
a reguláris kifejezés az utolsó 'x'-ig keres,
ezáltal olyat ragad meg, amire nem volt szükségünk.
Természetesen gyakran pont ez a viselkedés a szükséges. De ebben a konkrét esetben le kell állítani a kapzsiságot, és meg kell mondani a reguláris kifejezésnek, hogy az első 'x'-ig keressen. Ebben az esetben az ismétlési operátor után kérdőjelet kell tenni:
res = re.sub('a.+?x', '!', txt)
print(res) # kiírja a '! zzz x kkk' karakterláncot
A kapzsiság minden ismétlési operátornál
korlátozható: mind a *, mind a ?, mind
a {} - így: *?, ??
és {}?.
Adott a következő karakterlánc:
txt = 'aba accca azzza wwwwa'
Írj reguláris kifejezést, amely megtalálja az összes
karakterláncot, amelynek szélein 'a'
betűk állnak, és mindegyiket lecseréli
'!'-ra.
Az 'a' betűk között
bármilyen karakter állhat (kivéve 'a').