Страницы

Поиск по вопросам

суббота, 7 марта 2020 г.

Заменить группу в регулярном выражении python

#python #регулярные_выражения


Нужно заменить в строке совпадение с группой в регулярном выражении.
Пусть есть foo42buz, нужно получить foobarbuz
Очевидно, я сразу пытаюсь написать что-то такое

string = 'foo42buz'
pattern = re.compile(r'(\d+)buz')
re.sub(pattern,'bar',string)


Но это возвращает ту же foo42buz

Гуглю как заменить совпадение именно с группой и пытаюсь делать так 

string = 'foo42buz'
pattern = re.compile(r'(\d+)buz')
re.sub(pattern,r'\1bar',string)


и так

string = 'foo42buz'
pattern = re.compile(r'(\d+)buz')
re.sub(pattern,r'\g<1>bar',string)


и даже так

string = 'foo42buz'
pattern = re.compile(r'(?P\d+)buz')
re.sub(pattern,r'\gbar',string)


Но re.sub ведет себя очень неочевидным для меня образом, возвращая foo42buz



Попробую еще раз. Есть строка, есть регулярка с группой. Необходимо в строке подстроку
совпадающую с группой заменить на другую подстроку. 
Есть строка foo42buz, есть регулярка  (\d+)buz, где группа (\d+) совпадает с подстрокой
42. Нужно заменить это совпадение другой строкой bar, чтобы получилась в итоге строка
foobarbuz.
    


Ответы

Ответ 1



Еще 1 вариант, но это экзотика :) >>> re.sub(re.findall(r'(\d+)buz', string)[0], 'bar', string) 'foobarbuz'

Ответ 2



Ваша проблема вероятно, что вы думаете, что pattern.sub(repl, text) изменяет text. Строки в Питоне неизменяемы. Чтобы текст поменялся (новое значение получить): text = pattern.sub(repl, text) Чтобы только цифры заменить, можно lookahead assertion использовать: >>> import re >>> re.sub(r'\d+(?=buz)', 'bar', 'foo42buz') 'foobarbuz'

Ответ 3



Правильные ответы даны. Еще один вариант (с использованием синтаксиса \N) >>> re.sub(r'(foo)\d+(bar)', r'\1buz\2', '--foo42bar--') '--foobuzbar--' >>> В группы Вам нужно выделять как раз то, что должно остаться в строке, чтобы использовать в "строке замены". re.sub, условно говоря, меняет на второй аргумент, целиком объект match, или match.group(0). Любую группу (в том числе \0 можно использовать во втором аргументе. Грубо говоря, result = re.sub(pattern, rep, string) эквивалентно m = pattern.search(string) if m: result = string.replace(m.group(0), rep) С той разницей, что в rep можно использовать специальные символы \N для подстановки m.group(N). То есть прямо так, как Вы хотите Необходимо в строке подстроку совпадающую с группой заменить на другую подстроку. сделать нельзя.

Комментариев нет:

Отправить комментарий