2017-09-03 14 views
2

動作しないのはなぜ私は数字のためのいくつかの交換を行うためにre.sub()を使用している場合、私は、Pythonの「re」部分を学んでいます、そして名前のパターン(?P=name)が私を混同し、Pythonの正規表現(?P = nameは)

と文字「(?P=name)」は機能しませんが、パターン「\N」と「\g<name>」は意味があります。以下のコード:

[IN]print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'(?P=char)-(?P=digit)', '123-abcd')) 
[OUT] (?P=char)-(?P=digit) 
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\2-\1', '123-abcd')) 
[OUT] abcd-123 
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\g<char>-\g<digit>', '123-abcd')) 
[OUT] abcd-123 

それは私が(?P=name)を使用する場合、代替を行うことができなかったのはなぜ?
正しく使用する方法は?私は

+0

''におけるパターン後方参照である(P =名前は?)。置換パターンでは使用できません。 –

+0

"P = name"で何を達成しようとしていましたか? – madtyn

答えて

3

(?P=name)のPython 3.5を使用してい
インライン(イン・パターン)が後方参照あります。もしPython Regular Expression Syntax referenceを参照して、対応する名前の捕捉基によって捕捉されるのと同じ内容と一致する正規表現パターン内で使用することができる:

(?P=name)
後方参照という名前のグループに、これは、nameという名前の以前のグループによって照合されたテキストと一致します。 「数字」グループの試合とは123をキャプチャするため、「CHAR」グループはabcdをキャプチャし、123-abcd&abcd-123(?P<digit>\d{3})-(?P<char>\w{4})&(?P=char)-(?P=digit)試合後、名前のインライン後方参照がabcd123一致:

this demoを参照してください。

マッチを置換するには、\1,\g<1>または\g<char>の構文でre.subの置換パターンを使用します。その目的のために(?P=name)を使用しないでください:文字列または関数...後方参照など、\6することができ

REPL、...

パターンのグループ6とマッチしたサブ文字列に置き換えられます文字列型のrepl引数では、上記の文字エスケープとバックリファレンスに加えて、\g<name>は、(?P<name>...)の構文で定義されているように、nameという名前のグループに一致する部分文字列を使用します。 \g<number>は、対応するグループ番号を使用します。したがって、\g<2>\2に相当しますが、置換ではあいまいではありません(\g<2>0など)。 \20は、グループ2への参照ではなく、リテラル文字 '0'に続くグループ20への参照として解釈されます。後方参照\g<0>は、REと一致する部分文字列全体を置換します。

+1

ありがとうございました。私はを名前付きグループのre式の中に使用し、は再パターン(\ d {3})ではなく、一致する結果( '123'など)を取得することを知っています。あなたの助けに感謝! –

1

あなたは使用しての詳細を確認し、バック参照を可能Pが訪問:?

https://docs.python.org/3/library/re.html 

と(P ...?)を探すために、ブラウザでCTRL + Fを使用しました。 P = nameを使うことができるときのすべての指示がある素晴らしいチャートです。

この例では、3回目のre.sub()コール時に正しく処理しています。

すべてのre.sub()呼び出しでは、このメソッドの最初の文字列パラメータでは?P = name構文のみを使用でき、\ g構文を使用するため、2番目の文字列パラメータでは不要です。

「?P =」という名前が便利なのは混乱していますが、既に名前付きの文字列を逆参照して一致させるためです。

例:potatoXXXpotatoに一致させ、YYXXXYYに置き換えます。あなたは作ることができます:

re.sub(r'(?P<myName>potato)(XXX)(?P=myName)', r'YY\2YY', 'potatoXXXpotato') 

または

re.sub(r'(?P<myName>potato)(?P<triple>XXX)(?P=myName)', r'YY\g<triple>YY', 'potatoXXXpotato') 
+1

ありがとう!あなたは私に正しい例を示すことによって、私に大きな賛辞をします。 –

+0

ようこそ。ドキュメントも便利です。次回はこの点を考慮してください:-) – madtyn