python re.sub group:\ numberの後の番号


183

どのように私は置き換えることができfoobarfoo123bar

これは機能しません:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

これは機能します:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

これはのような場合によくある問題だと思います\number。誰も私にこれを処理する方法についてのヒントを与えることができますか?


2
この質問は、「グループ」の下のスタックオーバーフローの正規表現に関するFAQに追加されました。
aliteralmind 2014

1
「キャプチャグループ」または「番号付きグループ参照」という用語が含まれていないため、この質問を見つけるのにかなり長い時間がかかりましたが、私は最終的にここに来て、あなたがそれを聞いてうれしいです。
Mark Ch

1
あなたの問題は、r '\ 112'が8進数リテラル0112、ASCII'J '、または10進数74として解釈されることです。文字列連結または''.join()
smci

質問からの小さな逸脱、すべてのグループ一致を参照する方法、つまりr '\ <for allmatch> hi'?
Sayan Dey

回答:


313

答えは:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

ドキュメントからの関連抜粋:

上記の文字エスケープと後方参照に加えて、\ gは、(?P ...)構文で定義されているように、nameという名前のグループに一致する部分文字列を使用します。\ gは対応するグループ番号を使用します。したがって、\ g <2>は\ 2と同等ですが、\ g <2> 0などの置換ではあいまいではありません。\ 20はグループ20への参照として解釈され、グループ2への参照の後にリテラル文字「0」が続くと解釈されません。後方参照\ g <0>は、REに一致する部分文字列全体を置き換えます。


48
自分にそんなに難しいことはありません。それ非常に深いドキュメンテーションに埋め込まれているのでほとんどの人が質問をグーグルしてこの答えをSOに出すよりも、ドキュメントを読むのにはるかに長い時間を要します。
スピードプレーン

1
提供された正確な引用は、コンテキストを探している場合のためにここにあります
パトリック

グループを取得して変更できますか?\ g <1> ...たとえば、この場合、g <1>はfooですが、この「fuu」のように、oをuに変更します
Eric Bellet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.