Ограничение жадности в регулярках в 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'
).