Как использовать регулярное выражение Python для замены с использованием захваченной группы? - PullRequest
46 голосов
/ 15 июля 2011

Предположим, я хочу изменить 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? Я пробовал:

>>> import re
>>> 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'

Ответы [ 4 ]

57 голосов
/ 15 июля 2011

Вам нужно экранировать обратную косую черту:

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

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

p.sub(r'gray \1', s)
17 голосов
/ 01 июля 2014

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

p = re.compile(r'blue (?P<animal>dog|cat)')
p.sub(r'gray \g<animal>',s)
6 голосов
/ 15 июля 2011

Попробуйте это:

p.sub('gray \g<1>',s)
4 голосов
/ 28 декабря 2016

Не по теме, для пронумерованных групп захвата:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...