web-dev-qa-db-ja.com

python regexを使用して、キャプチャされたグループを使用して置き換える方法は?

the blue dog and blue cat wore blue hatsthe 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'
48
Eric Wilson

バックスラッシュをエスケープする必要があります。

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

あるいは、正規表現で既に行ったように、生の文字列を使用できます。

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

同様の答えを探していたので、しかし、置換内で名前付きグループを使用したいので、他の人のためにコードを追加すると思いました:

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

これを試して:

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

トピック外、番号付きキャプチャグループの場合:

#/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として入力された'\\1'は、最初のキャプチャグループ(\d)を参照し、\2は2番目のキャプチャグループを参照します。

5
ThorSummoner