Regulaaravaldiste ahnuse piiramine Pythonis
Regulaaravaldised on vaikimisi ahnad. See tähendab, et nad püüavad kinni võimalikult palju sümboleid. Vaatame seda näitega. Oletame, et meil on järgmine sõne:
txt = 'aeeex zzz x kkk'
Selles sõnes soovime leida alamstringi
'aeeex' järgmise mustri järgi:
täht 'a', siis suvaline sümbol
üks või mitu korda, siis täht 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Kuigi me peaksime saama stringi '! zzz
x kkk', kuvatakse string '! kkk'.
Asi on selles, et meie regulaaravaldis otsib
kõiki sümboleid tähest 'a' kuni täheni
'x'. Kuid meie sõnes on kaks tähte
'x'! Ahnuse tõttu juhtub nii, et
regulaaravaldis otsib kuni viimase 'x'-ni,
haarates seeläbi mitte seda, mida meil
vaja oli.
Muidugi on selline käitumine sageli just see, mida me vajame. Kuid sellisel juhul on vaja ahnust keelata ja öelda regulaaravaldisele, et see otsiks kuni esimese 'x'-ni. Sel juhul tuleks kordusoperaatori järel panna küsimärk:
res = re.sub('a.+?x', '!', txt)
print(res) # väljastab stringi '! zzz x kkk'
Ahnust saab piirata kõikidele kordusoperaatoritele:
nii *, kui ?, ja
{} - niimoodi: *?, ??
ja {}?.
Antud sõne:
txt = 'aba accca azzza wwwwa'
Kirjutage regulaaravaldis, mis leiab kõik
stringid, mille mõlemas otsas on tähed
'a', ja asendab igaühe neist
'!'-ga. Tähtede 'a' vahel võib
olla suvaline sümbol (välja arvatud 'a').