2016-04-06 7 views
1

私はパターンマッチングを行い、第一の人物と第二の人物をPython 2.7で置き換えようとしています。Python 2.7 Regexのキャプチャグループが予測どおりに動作しない

string = re.sub(r'(\W)I(\W)', '\g<1>you\g<2>',string) 
string = re.sub(r'(\W)(me)(\W)', '\g<1>you\g<3>',string) 
# but does NOT work 
string = re.sub(r'(\W)I|(me)(\W)', '\g<1>you\g<3>',string) 

私は最後の正規表現を使用したいのですが、何とかキャプチャグループは、すべて台無しにしているとさえ< 0>は奇妙な、不規則な一致を示し、\ gを行います。キャプチャグループ3は最後の単語境界になると思いますが、そうでないようです。

サンプル文は次のようになります。I like candy.

私は(私が最初になるので、私は実際に選択されることはありません)交換の正しさであまり興味がないが、私は、なぜキャプチャグループを知りません私が期待するように働かないでください。

ありがとうございます!

+0

Pythonのバージョンはところで、何ですか? –

+0

2.7!私は質問に追加します。 –

+0

次に、3番目のパターンには少なくとも2つの問題があります:間違った交替の境界、および参加していないグループの交換。あなたは ''不一致なグループ ''のエラーを取得していませんか? –

答えて

2

次の正規表現で試してみてください。

正規表現:\b(I|me)\b

説明:

  • \b両側には、ワード境界をマークします。

  • (I|me)はいずれもIまたはmeと一致します。

注: -あなたはそれ大文字と小文字を区別iフラグを使用して行うことができます。

Regex101 Demo

+0

これは良い答えです。しかし、キャプチャグループ3がもはや私が期待していたものではないというように、交代がキャプチャグループを台無しにしているように見える理由は分かりますか? –

+0

@NickAnderson:単語境界の代わりに '\ W'を使ったので、' I'が文字列の先頭にあるときに失敗します。 '(\ W)(私)|私(\ W)'も[デモ](https://regex101.com/r/gS0iA7/2)でも動作しますが、単語境界を使う方が安全です。 –

+0

これは本当です。しかし、文字列= re.sub(r '(\ W)I |(me)(\ W)'、 '\ g <1> you \ g <3>'、string)とstring = reを比較します。サブ(r '(\ W)(I |私)(\ W)'、 '\ g <1>あなた\ g <3>'、文字列)、グループはなぜ異なっていますか?交替演算子の下にネストされたキャプチャグループを作成すると、その動作方法が変わるのはなぜですか?私はPythonのドキュメントで、<2>をネストされたレベルを参照するのに使うことができることを知ったので、コンテキストに基づいて意味が変わるのでしょうか? –