Omejitev požrešnosti v regularnih izrazih v Pythonu
Regularni izrazi so privzeto požrešni. To pomeni, da zajamejo čim večje možno število znakov. Poglejmo si primer. Recimo, da imamo naslednjo niz:
txt = 'aeeex zzz x kkk'
V tem nizu želimo najti podniz
'aeeex' z naslednjim vzorcem:
črka 'a', nato kateri koli znak
enkrat ali večkrat, nato črka 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Čeprav pričakujemo niz '! zzz
x kkk', bo izpisal niz '! kkk'.
Razlog je v tem, da naš regularni izraz išče
vse znake od črke 'a' do črke
'x'. Toda v našem nizu sta dve črki
'x'! Zaradi požrešnosti se izkaže, da
regularni izraz išče do zadnjega 'x',
s čimer zajame nekaj, kar nismo želeli.
Seveda je takšno vedenje pogosto zaželeno. Toda ravno v tem primeru moramo prekiniti požrešnost in reči regularnemu izrazu, da naj išče do prvega 'x'. V tem primeru moramo za operatorjem ponavljanja dodati vprašaj:
res = re.sub('a.+?x', '!', txt)
print(res) # izpiše niz '! zzz x kkk'
Požrešnost lahko omejimo vsem operatorjem
ponavljanja: tako *, kot ?, in
{} - takole: *?, ??
in {}?.
Dan je niz:
txt = 'aba accca azzza wwwwa'
Napišite regularni izraz, ki bo našel vse
nize, na katerih so na robu črke
'a', in jih zamenjal z
'!'. Med črkama 'a' je lahko
kateri koli znak (razen 'a').