Как использовать регулярное выражение python для замены с помощью захваченной группы?

249
33

Предположим, я хочу изменить the blue dog and blue cat wore blue hats на the gray dog and gray cat wore blue hats.


С sed я мог бы выполнить это следующим образом:


$ echo 'the blue dog and blue cat wore blue hats' | sed 's/blue \(dog\|cat\)/gray \1/g'

Как я могу сделать аналогичную замену в Python? Я пробовал:


>>> s = "the blue dog and blue cat wore blue hats"
>>> p = re.compile(r"blue (dog|cat)")
>>> p.sub('gray \1',s)
'the gray \x01 and gray \x01 wore blue hats'

спросил(а) 2021-01-19T11:33:11+03:00 6 месяцев, 1 неделя назад
1
Решение
287

Вам нужно избегать обратной косой черты:


p.sub('gray \\1', s)

альтернативно вы можете использовать необработанную строку, как вы уже делали для регулярного выражения:


p.sub(r'gray \1', s)

ответил(а) 2021-01-19T11:33:11+03:00 6 месяцев, 1 неделя назад
141

Поскольку я искал аналогичный ответ; но желая использовать именованные группы в замене, я думал, что добавлю код для других:

p = re.compile(r'blue (?P<animal>dog|cat)')
p.sub(r'gray \g<animal>',s)

ответил(а) 2021-01-19T11:33:11+03:00 6 месяцев, 1 неделя назад
109

Попробуйте следующее:


p.sub('gray \g<1>',s)

ответил(а) 2021-01-19T11:33:11+03:00 6 месяцев, 1 неделя назад
77

Отключить тему,
Для нумерованных групп захвата:


#/usr/bin/env python
import re

re.sub(
pattern=r'(\d)(\w+)',
repl='word: \\2, digit: \\1',
string='1asdf'
)


word: asdf, digit: 1



Python использует литеральную обратную косую черту, плюс один-на-индекс для нумерации записей группы захвата, как показано в этом примере. Итак \1, введенный как '\\1', ссылается на первую группу захвата (\d) и \2 вторую захваченную группу.

ответил(а) 2021-01-19T11:33:11+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема