#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'\g bar',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). То есть прямо так, как Вы хотите Необходимо в строке подстроку совпадающую с группой заменить на другую подстроку. сделать нельзя.
Комментариев нет:
Отправить комментарий