を働いていない正規表現でエスケープ文字をエスケープするが、ときに私それは
0123で一致を見つけregex = '[\w!\-$%^&*()_+|~=`{}\[\]:";\'<>?,[email protected]#\\\\/]+'
に正規表現を変更
match = '\\Gs7iCHE'
なぜこのような振る舞いがわかりません。
を働いていない正規表現でエスケープ文字をエスケープするが、ときに私それは
0123で一致を見つけregex = '[\w!\-$%^&*()_+|~=`{}\[\]:";\'<>?,[email protected]#\\\\/]+'
に正規表現を変更
match = '\\Gs7iCHE'
なぜこのような振る舞いがわかりません。
あなたの正規表現は正しいです。正規表現の前に生の文字列r
を使用して解析し、あなたは、単一引用符文字列を\\
に第二1 \\\\
にあなたの正規表現を変更した場合には、罰金
re.compile(r'[\w!\-$%^&*()_+|~=`{}\[\]:";\'<>?,[email protected]#\\/]+')
バックスラッシュ\
は、文字列にするためにエスケープする必要があります。エスケープされた\
は文字セットでエスケープする必要があるため、\\\\
と入力する必要があります。あなたの最初のケースでは、それはエスケープします/
また、他のエスケープは文字列エスケープを行います。したがって、エスケープワンドは範囲!-$
を追加します。言い換えれば
- しようとしない:[
をエスケープする
regex = '[\\w!\\-$%^&*()_+|~=`{}[\\]:";\'<>?,[email protected]#\\\\/]+'
必要はありません。
よろしくお願いします。
正規表現は正しいですが、それでも私の質問だったパスワード文字列に '\\'を二重に返します。 – Tega
動作します。
これは大丈夫ですが、あなたの正規表現はリテラルエスケープと一致します。
内部では数値化された文字クラス[\\]+
のため、ターゲット文字列内に多くのエスケープを一致させるには
になります。
あなたのターゲット文字列は\\Gs7iCHE
であり、それはすべてが一致しています。単一引用符文字列をエスケープについて注意する
一つのこと、
この'\\\'
はパース後'\\\\'
と同じです。すなわち、両方とも
が\\
になります。
正規表現の味は何ですか? – anubhava
"ほとんどの正規表現のフレーバでは、文字クラス内の特殊文字またはメタキャラクタは、閉じ括弧(])、バックスラッシュ(\)、キャレット(^)、およびハイフン( - )のみです。通常のメタ文字は、文字クラスの中で、バックスラッシュでエスケープする必要はありません。 –
PCREを使用している場合は、最後の「/」:https:// regex101が好きではないようです。com/r/rI0vW6/1 –