Абмежаванне пражэрнасці ў рэгулярках у Python
Рэгулярныя выразы па змаўчанні пражэрныя. Гэта значыць, што яны захопліваюць максімальна магчымая колькасць сімвалаў. Давайце разбярэм на прыкладзе. Хай у нас ёсць вось такая радок:
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').