re.sub('a(b)','d','abc')
はdc
ではなくadc
を生成します。
どして re.sub
キャプチャグループだけでなく、キャプチャグループ全体を置き換えます '(b)'?
それはパターンの出現全体を置き換えることになっているので:
String内のパターンの左端の重複しないオカレンスを置換replで置き換えることによって取得された文字列を返します。
一部のサブグループのみを置き換える場合、複数のグループを持つ複雑な正規表現は機能しません。考えられる解決策はいくつかあります。
re.sub('ab', 'ad', 'abc')
-非常に読みやすく明示的であるため、私のお気に入りです。re.sub('(a)b', r'\1d', 'abc')
repl
引数としてコールバック関数を提供し、Match
オブジェクトを処理して必要な結果を返すようにします。re.sub('(?<=a)b', r'd', 'abxb')
はadxb
を生成します。 ?<=
グループの最初に「先読みです」と書かれています。import re
pattern = re.compile(r"I am (\d{1,2}) .*", re.IGNORECASE)
text = "i am 32 years old"
if re.match(pattern, text):
print(
re.sub(pattern, r"Your are \1 years old.", text, count=1)
)
上記のように、最初に大文字と小文字を区別しないフラグを使用して正規表現パターンをコンパイルします。
次に、テキストがパターンと一致するかどうかをチェックし、一致する場合は、グループ番号\ 1の正規表現パターン(年齢)の唯一のグループを参照します。