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


183

Як я можу замінити foobarз foo123bar?

Це не працює:

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

Це працює:

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

Я думаю, що це поширене питання, коли мати щось подібне \number. Хтось може дати мені підказку, як з цим впоратися?


2
Це запитання було додано до поширених запитань щодо регулярного вираження стека в розділі "Групи".
aliteralmind

1
це питання зайняло у мене досить багато часу, тому що в ньому немає термінів "група захоплення" або "нумеровані посилання на групу", але я врешті-решт тут і рада, що ви це задали.
Марк Ч.

1
Ваша проблема полягає в тому, що r '\ 112' інтерпретується як восьмеричний буквальний 0112, ASCII'J 'або десятковий 74. Ви не бачите, як змусити зворотну посилання' \ 1 'оцінити перед конкатенацією рядків або''.join()
smci

невеликий відхилення від питання, будь-який спосіб віднести всі групові матчі, тобто r '\ <для всіх матчів> привіт'?
Саян Дей

Відповіді:


313

Відповідь:

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

Відповідний уривок із документів:

Крім уникнення символів та зворотних посилань, як описано вище, \ g буде використовувати підрядку, відповідну імені групи з ім'ям, визначеному синтаксисом (? P ...). \ g використовує відповідний номер групи; \ g <2> тому еквівалентно \ 2, але не є неоднозначним у такій заміні, як \ g <2> 0. \ 20 інтерпретується як посилання на групу 20, а не посилання на групу 2, за якою слідує буквальний символ "0". Зворотне відношення \ g <0> підміняє у всій підрядці, яка відповідає RE.


48
Не будьте настільки жорсткі до себе. Це поховано в документації настільки глибоко, що для більшості людей знадобиться набагато більше часу, щоб прочитати документи, ніж гугл їхнє питання, і ця відповідь з'явиться на ТАК.
швидкісний літак

1
Тут ви знайдете точну цитату, якщо ви шукаєте контекст
Патрік

Чи можу я взяти групу та змінити її? \ g <1> ... Наприклад, у цьому випадку g <1> є foo, але я хочу змінити o на u, як це "fuu"
Ерік Беллет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.