2011-01-21 9 views
1

正規表現の文字セットは[]で指定します。文字セットは、囲まれた文字のいずれかと一致します。たとえば、[abc]は 'a'、 'b'、または 'c'のいずれかと一致します。Pythonとre2cの正規表現の文字セットの違い

Pythonre2c正規表現の文字セットには、潜在的な違いがあることがわかります。私は両方で同じであるか知っている:

  • どちら例えば[AZ]は、すべて小文字に一致し、範囲を受け入れる
  • どちらの両方の共通英数字を受け入れる[^ ...]の表記
  • を使用して逆のセットを受け入れますおよび他のいくつかの文字(スペースなど)

は、しかし、私は、これらは異なる可能性があることについて心配:

  • Charact文字の内側にエスケープする必要がERSはどこリテラルを配置する場所を
  • を設定「 - 」または「^」私はその文字を一致させたいと逆のセットまたは範囲
を指定しない場合は文字セットの内部

Pythonとre2cの文字セットの違いを説明できますか?

+0

re2cについて聞いたことがありませんが、使用例は見えませんあなたの平均的なPCREのように - そしてPythonの 're'もPCREなので、(lookaroundのようなより高度な機能ではほとんどの微妙な意味の違いで)大きな違いはありません。 – delnan

+1

re2cはPCRE/Pythonを大幅に削除したバージョンです。これはDFAを使用して、複数の正規表現を一度にすべての一致についてチェックします。つまり、長さがO(n)文字の正規表現がm個あれば、re2cはPCREとPythonが最高にできるO(m * n)ではなく、O(n)で一致するものを判別します。 re2cは消費電力が少ないので、文字数が少ないということは、文字セットが異なる可能性があることを意味する特別な意味を意味します。 –

答えて

1

あなたが提供したre2cマニュアルリンクを見ると、re2cは同じ構文を使用しているように見えますが、その構文のサブセットのみです。正規表現の構文についてのあなたの具体的な質問の文字セットの内側にエスケープする必要が

文字に対処するために

具体的にはどのような文字を使用していますか? ^については

文字セット内のリテラル-または^を配置する場所を...

、どこにもなく、初めは行う必要があり、そして-のために、どこにもなく、途中で行う必要があります。

>>> import re 
>>> match_literal_hyphen = "[ab-]" 
>>> re.findall(match_literal_hyphen, "abc - def") 
['a', 'b', '-'] 
>>> match_literal_caret = "[a^b]" 
>>> re.findall(match_literal_caret, "abc^def") 
['a', 'b', '^'] 
+0

私は文字を参照しています。$ * +?{}()はPythonで特別な意味を持ちますが、バックスラッシュと[]がエスケープする必要があると仮定しています。つまり、[\\ [\\] \\ \] '['、 ']'、 '\'のいずれかに一致するようにしてください –

0

私は混乱の原因は何逃れるだろう -

/[][]/マッチ ']' や '['
/[[]]/マッチ '[]'
/[]]]/マッチ ']]'
/[[[]/試合を「[ '
/[]/ umatched' ['エラー

+0

あなたは[\\ [\\]]を行うことを提案していますか?私はそれがPythonとre2cの両方で動作すると思いますが、それらはエスケープする必要がある唯一の2文字です。 –