Ограничење похлепности регуларних израза у Пајтону
Регуларни изрази подразумевано су похлепни. То значи да они захватају максимални могући број карактера. Хајде да погледамо на примеру. Нека имамо овакав стринг:
txt = 'aeeex zzz x kkk'
У овом стрингу желимо да пронађемо подстринг
'aeeex' следећим шаблоном:
слово 'a', затим било који карактер
један или више пута, затим слово 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Иако очекујемо стринг '! zzz
x kkk', исписаће се стринг '! kkk'.
Разлог је у томе што наш регуларни израз тражи
све карактере од слова 'a' до слова
'x'. Али у нашем стрингу има два слова
'x'! Због похлепности испада да
регуларни израз тражи до самог последњег икса,
чиме захвата не оно што нам је било
потребно.
Наравно, често нам је управо такво понашање и потребно. Али баш у овом случају треба онемогућити похлепност и рећи регуларном изразу да тражи до првог икса. У томе случају треба после оператора понављања ставити знак питања:
res = re.sub('a.+?x', '!', txt)
print(res) # исписаће стринг '! zzz x kkk'
Похлепност се може ограничити свим операторима
понављања: и *, и ?, и
{} - ево овако: *?, ??
и {}?.
Дат је стринг:
txt = 'aba accca azzza wwwwa'
Напишите регуларни израз који проналази све
стрингове на чијим су ивицама слова
'a', и замењује сваки од њих са
'!'. Између слова 'a' може
бити било који карактер (осим 'a').