Regularās izteiksmes mantkārības ierobežošana Python
Regularās izteiksmes pēc noklusējuma ir mantkārīgas. Tas nozīmē, ka tās satver maksimāli iespējamo simbolu daudzumu. Analizēsim to ar piemēru. Pieņemsim, ka mums ir šāda virkne:
txt = 'aeeex zzz x kkk'
Šajā virknē vēlamies atrast apakšvirkni
'aeeex' pēc šāda parauga:
burts 'a', pēc tam jebkura rakstzīme
vienu vai vairāk reizes, pēc tam burts 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Lai arī mums vajadzētu iegūt virkni '! zzz
x kkk', tiks izdrukāta virkne '! kkk'.
Visa būtība ir tajā, ka mūsu regularā izteiksme meklē
visas rakstzīmes no burta 'a' līdz burtam
'x'. Bet mūsu virknē ir divi burti
'x'! Mantkārības dēļ izrādās, ka
regularā izteiksme meklē līdz pat pēdējā x,
tādējādi satverot ne to, kas mums bija
vajadzīgs.
Protams, bieži vien tieši šāda uzvedība mums ir vajadzīga. Bet konkrēti šajā gadījumā ir nepieciešams atslēgt mantkārību un likt regularajai izteiksmei, lai tā meklē līdz pirmajam x. Šajā gadījumā atkārtošanās operatoram vajadzētu pievienot jautājuma zīmi:
res = re.sub('a.+?x', '!', txt)
print(res) # izvadīs virkni '! zzz x kkk'
Mantkārību var ierobežot visiem atkārtošanās
operatoriem: gan *, gan ?, un
{} - šādi: *?, ??
un {}?.
Dota virkne:
txt = 'aba accca azzza wwwwa'
Uzrakstiet regularu izteiksmi, kas atradīs visas
virknes, kuru malās atrodas burti
'a', un aizstās katru no tām ar
'!'. Starp burtiem 'a' var
būt jebkura rakstzīme (izņemot 'a').