2017-02-08 9 views
0

re.sub('a(b)','d','abc')dcであり、adcではない。では、なぜre.subはここでキャプチャグループを理解していないのですか?捕捉基を有するRe.sub

+0

代替部分では使用しないので、どうしますか? "b"の前に "a"を置きたい場合は、re.sub( 'ab'、 'ad'、 'abc') 'または' re.sub( '(a)b' r '\ 1d'、 'abc') '、' '\ 1" 'はキャプチャグループを指します。 – DyZ

+0

ありがとう!キャプチャグループがデフォルトに置き換えられることが予想されます。適切なアプローチはあまり直感的ではありませんが、おそらくより柔軟です。 – Nick

答えて

2

パターンの全体発生を置き換えることになっていますので:

戻り、置換replで文字列のパターンの左端の非重複発生を置き換えた文字列。

いくつかのサブグループだけを置き換える場合、いくつかのグループを持つ複雑な正規表現は機能しません。いくつかの可能な解決策があります。

  1. はフルでパターンを指定します:re.sub('ab', 'ad', 'abc') - それは非常に読みやすいと明示的だとして、私のお気に入り。 re.sub('(a)b', r'\1d', 'abc')前のオプションと同様に
  2. :あなたはを維持し、その後、パターン(エスケープ回避するために、生の文字列でなければならないことに注意)でそれらを参照したい
  3. キャプチャグループrepl引数としてコールバック関数を提供し、 Matchオブジェクトを処理させ、必要な結果を返します。
  4. マッチには含まれていませんが、一致に影響するlookbehinds/lookahedsを使用してください:re.sub('(?<=a)b', r'd', 'abxb')adxbです。グループの冒頭の?<=には、「それは先読みだ」と書かれています。
+1

簡単なヒント:regex **: 're.match(r '([la] {2}) - \ 1'、 'la-la')'で '\ 1' **を使うことができます。これは、参照されたグループ(このケースでは '1 ')**にマッチする**(パターンではない)と一致するので、この正規表現は' la-al'と一致しません。 – math2001

関連する問題