がそれです - ! '!' 92から33 = ORD()から\(文字= ORD( '\') とセットで '&' 私は私の解釈が間違っていると思いますregexの場合、r '[! - 。&]'はどういう意味ですか?
''?私のテストに基づく。
しかし、Pythonの参照が私の解釈が間違って何も言いません。要するに http://docs.python.org/library/re.html
がそれです - ! '!' 92から33 = ORD()から\(文字= ORD( '\') とセットで '&' 私は私の解釈が間違っていると思いますregexの場合、r '[! - 。&]'はどういう意味ですか?
''?私のテストに基づく。
しかし、Pythonの参照が私の解釈が間違って何も言いません。要するに http://docs.python.org/library/re.html
、r'[!-\.&]'
はr'[!-.]'
を書くだけで複雑な形状である。
これは、すべてのCHが一致します33 = ord('!')
と46 = ord('.')
間ord
、次のいずれかのつまりとaracters:
!"#$%&\'()*+,-.
.
前にエスケープバックスラッシュは文字クラスでは無視されます。文字クラス内のすべての文字に一致しても意味がありません(.
)。アンパサンド&
はすでに文字クラスに入っているので、それは余計です。
バックスラッシュはドットをエスケープするため、範囲は!
から.
になります。正規表現がマッチします:それは範囲に含まれている、そしてそれは文字クラス内なので、ドットをエスケープすることはどちらかの必要はありませんので、
!"#$%&'()*+,-.
を最後&
は必要ありません。
この正規表現の目的は、 "!"の間の任意の文字にマッチすることです。と "。" (スラッシュが "。"文字をエスケープしていることに注意してください)、これは! " # $ % & ' () * + , -
です。 (http://www.tamasoft.co.jp/en/general-info/unicode.htmlのUnicodeテーブルから)。表現について
2つのコメントは:通常
\
自体が、多分、除く)[]
カッコ内の文字をエスケープする必要はありません。&
」は既に「!-.
」で定義された範囲に含まれているため、冗長です。1)エスケープする必要がある他の文字があります。たとえば、 ' - [] ^'はどこに置かれているかによって決まります。2)文字クラスが '! - 。&'のみにマッチする可能性があります。つまり、 ' - 'は範囲を示すために使用するのではなく、ハイフンそのものを示すために使用されます。 – NullUserException
テストパターンがchr(46)
を通じてchr(33)
と一致しますが、パターンはすべてのシステムでそのように動作することを保証されていないことを示してもよいです。理由は次のとおりです。文字セットはシステムによって異なります。
Perlの正規表現のドキュメントは、特にから始めると等しい場合([a-e]
、[A-E]
)、または数字([0-9]
)のアルファベットのいずれかで終わる範囲のみを使用する」をお勧めします理由です。他のものは安全ではありません」(Perl正規表現はPythonで使用される正規表現であるため、Perl正規表現は関係します)。
したがって、このパターンはEBCDICベースのプラットフォームで実行されると、異なる文字セットと一致します。 ASCIIベースのプラットフォームでパターンがchr(33)
からchr(46)
に一致すると言うだけです。
あなたの警告はUTF-8/16に適用されますか? – eugene
@Eugene:*任意の*マルチバイトエンコーディングでエンコードされたバイト列の*正規表現を使用することは非常に危険です。最初にUnicodeにデコードします。 –
あなたはそれをテストすることができます.. –