Godumo apribojimas reguliariosiose išraiškose Python
Reguliariosios išraiškos pagal nutylėjimą yra godžios. Tai reiškia, kad jos perima kuo daugiau simbolių kiek įmanoma. Pažiūrėkime pavyzdžiu. Tarkime, kad turime tokią eilutę:
txt = 'aeeex zzz x kkk'
Šioje eilutėje norime rasti poeilutę
'aeeex' pagal šį šabloną:
raidė 'a', tada bet koks simbolis
vieną ar daugiau kartų, tada raidė 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Nors mums reikia gauti eilutę '! zzz
x kkk', bus išvesta eilutė '! kkk'.
Visa tai dėl to, kad mūsų reguliarioji išraiška ieško
visų simbolių nuo raidės 'a' iki raidės
'x'. Bet mūsų eilutėje yra dvi raidės
'x'! Dėl godumo pasirodo, kad
reguliarioji išraiška ieško iki pat paskutinio x,
todėl perima ne tai, ko mums reikėjo.
Žinoma, dažnai toks elgesys mums ir reikalingas. Tačiau konkrečiai šiuo atveju reikia atšaukti godumą ir nurodyti reguliariajai išraiškai, kad ji ieškotų iki pirmojo x. Šiuo atveju po pakartojimo operatoriaus reikia padėti klaustuką:
res = re.sub('a.+?x', '!', txt)
print(res) # išves eilutę '! zzz x kkk'
Godumą galima apriboti visiems pakartojimo
operatoriams: ir *, ir ?, ir
{} - štai taip: *?, ??
ir {}?.
Duota eilutė:
txt = 'aba accca azzza wwwwa'
Parašykite reguliariąją išraišką, kuri ras visas
eilutes, kurių kraštuose yra raidės
'a', ir kiekvieną iš jų pakeis
'!'. Tarp raidžių 'a' gali
būti bet koks simbolis (išskyrus 'a').