Подтвердить что ты не робот

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

Предположим, я хочу изменить 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'
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

#/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 вторую захваченную группу.