Как использовать регулярное выражение 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'
Вам нужно избегать обратной косой черты:
p.sub('gray \\1', s)
альтернативно вы можете использовать необработанную строку, как вы уже делали для регулярного выражения:
p.sub(r'gray \1', s)
Поскольку я искал аналогичный ответ; но желая использовать именованные группы в замене, я думал, что добавлю код для других:
p = re.compile(r'blue (?P<animal>dog|cat)')
p.sub(r'gray \g<animal>',s)
Попробуйте следующее:
p.sub('gray \g<1>',s)
Отключить тему,
Для нумерованных групп захвата:
#/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
вторую захваченную группу.