Obmedzenie chamivosti v regulárnych výrazoch v Pythone
Regulárne výrazy sú predvolene chamtivé. To znamená, že zachytávajú čo najväčší možný počet znakov. Poďme si to rozobrať na príklade. Nech máme takýto reťazec:
txt = 'aeeex zzz x kkk'
V tomto reťazci chceme nájsť podreťazec
'aeeex' podľa nasledujúceho vzoru:
písmeno 'a', potom ľubovoľný znak
jeden alebo viackrát, potom písmeno 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Hoci chceme získať reťazec '! zzz
x kkk', vypíše sa reťazec '! kkk'.
Celé je to o tom, že náš regulárny výraz hľadá
všetky znaky od písmena 'a' po písmeno
'x'. Ale v našom reťazci sú dve písmená
'x'! Kvôli chamivosti sa stáva, že
regulárny výraz hľadá až po úplne posledné x,
čím zachytáva nie to, čo sme potrebovali.
Samozrejme, často je toto správanie práve to, čo potrebujeme. Ale konkrétne v tomto prípade je potrebné zrušiť chamivosť a povedať regulárnemu výrazu, aby hľadal len po prvé x. V tomto prípade by sme mali za operátorom opakovania umiestniť otáznik:
res = re.sub('a.+?x', '!', txt)
print(res) # vypíše reťazec '! zzz x kkk'
Chamivosť možno obmedziť všetkým operátorom
opakovania: aj *, aj ?, a
{} - takto: *?, ??
a {}?.
Daný reťazec:
txt = 'aba accca azzza wwwwa'
Napíšte regulárny výraz, ktorý nájde všetky
reťazce, na okrajoch ktorých sú písmená
'a', a nahradí každý z nich
'!'. Medzi písmenami 'a' môže
byť ľubovoľný znok (okrem 'a').