группа python re.sub: число после \ число

183

Как я могу заменить foobarна foo123bar?

Это не работает:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

Это работает:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

Я думаю, что это общая проблема, когда есть что-то подобное \number. Кто-нибудь может дать мне подсказку о том, как справиться с этим?

Zhigang
источник
2
Этот вопрос был добавлен в FAQ по регулярным выражениям Stack Overflow в разделе «Группы».
aliteralmind
1
этот вопрос занял у меня довольно много времени, потому что в нем нет терминов «группа захвата» или «ссылка на пронумерованную группу», но я в конце концов здесь и рад, что вы его задали.
Марк Ch
1
Ваша проблема в том, что r '\ 112' интерпретируется как восьмеричный литерал 0112, ASCII'J 'или десятичный 74. Не могу понять, как заставить обратную ссылку' \ 1 'получить оценку перед конкатенацией строк или''.join()
smci
небольшое отклонение от вопроса, есть ли способ ссылаться на все совпадения группы, т. е. r '\ <для всех совпадений> hi'?
Саян Дей

Ответы:

313

Ответ:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

Соответствующая выдержка из документов:

В дополнение к экранированию символов и обратным ссылкам, как описано выше, \ g будет использовать подстроку, соответствующую группе с именем name, как определено синтаксисом (? P ...). \ g использует соответствующий номер группы; \ g <2>, следовательно, эквивалентно \ 2, но не является неоднозначным в замене, такой как \ g <2> 0. \ 20 будет интерпретироваться как ссылка на группу 20, а не ссылка на группу 2, за которой следует буквальный символ '0'. Обратная ссылка \ g <0> подставляет во всю подстроку, совпадающую с RE.

Джон Гейнс младший
источник
48
Не будь таким строгим с собой. Он настолько глубоко погружен в документацию , что большинству людей понадобится гораздо больше времени, чтобы прочитать документы, чем погуглить их вопрос и получить этот ответ на SO.
скоростной самолет
1
Точная приведенная цитата находится здесь, если вы ищете контекст
Патрик
Могу ли я взять группу и изменить ее? \ g <1> ... Например, в этом случае g <1> - это foo, но я хочу изменить o на u, например, на «fuu»
Эрик Беллет,