2016-04-22 6 views
1

を働いていない正規表現でエスケープ文字をエスケープするが、ときに私それは

0123で一致を見つけ

regex = '[\w!\-$%^&*()_+|~=`{}\[\]:";\'<>?,[email protected]#\\\\/]+' 

に正規表現を変更

match = '\\Gs7iCHE' 

なぜこのような振る舞いがわかりません。

+1

正規表現の味は何ですか? – anubhava

+0

"ほとんどの正規表現のフレーバでは、文字クラス内の特殊文字またはメタキャラクタは、閉じ括弧(])、バックスラッシュ(\)、キャレット(^)、およびハイフン( - )のみです。通常のメタ文字は、文字クラスの中で、バックスラッシュでエスケープする必要はありません。 –

+0

PCREを使用している場合は、最後の「/」:https:// regex101が好きではないようです。com/r/rI0vW6/1 –

答えて

2

あなたの正規表現は正しいです。正規表現の前に生の文字列rを使用して解析し、あなたは、単一引用符文字列を\\に第二1 \\\\
にあなたの正規表現を変更した場合には、罰金

re.compile(r'[\w!\-$%^&*()_+|~=`{}\[\]:";\'<>?,[email protected]#\\/]+') 

Check

0

バックスラッシュ\は、文字列にするためにエスケープする必要があります。エスケープされた\は文字セットでエスケープする必要があるため、\\\\と入力する必要があります。あなたの最初のケースでは、それはエスケープします/

また、他のエスケープは文字列エスケープを行います。したがって、エスケープワンドは範囲!-$を追加します。言い換えれば

- しようとしない:[をエスケープする

regex = '[\\w!\\-$%^&*()_+|~=`{}[\\]:";\'<>?,[email protected]#\\\\/]+' 

必要はありません。

よろしくお願いします。

+0

正規表現は正しいですが、それでも私の質問だったパスワード文字列に '\\'を二重に返します。 – Tega

0

動作します。

これは大丈夫ですが、あなたの正規表現はリテラルエスケープと一致します。
内部では数値化された文字クラス[\\]+のため、ターゲット文字列内に多くのエスケープを一致させるには
になります。

あなたのターゲット文字列は\\Gs7iCHEであり、それはすべてが一致しています。単一引用符文字列をエスケープについて注意する

一つのこと、
この'\\\'はパース後'\\\\'と同じです。すなわち、両方とも
\\になります。

関連する問題