1

次のコードがあります。

import re
r = re.compile(r'[*-/]')
print r.match('.') is not None

を出力Trueし、指定された正規表現に一致することを示しますが、'.'一致しないことを示します。正規表現に明らかな何かが欠けていますか?

私は2.7.3osxでcpythonを使用しています10.8.2

セット内の 3 つの文字のいずれか[]が削除された場合、それは機能します。

4

2 に答える 2

11

以下のように書くと、

r = re.compile(r'[*-/]')

-reallyの使用は、*との間の任意の文字に一致することを意味し/ます。アスキーテーブルを見ると、

*      42
+      43
,      44
-      45
.      46
/      47

.そして、それがキャラクターにマッチする理由です。現在の正規表現も一致します。

>>> print r.match('+')
<_sre.SRE_Match object at 0x100483370>
>>> print r.match(',')
<_sre.SRE_Match object at 0x100483370>

*orのみに一致するように正規表現を修正するには-、次のように/エスケープできます。-

r = re.compile(r'[*\-/]')

その後、一致するものはありません.

>>> print r.match('.') is not None
False
于 2013-04-13T21:09:46.963 に答える
6

を使用してコンパイルしますre.DEBUG

In [3]: r = re.compile(r'[*-/]', re.DEBUG)
in
  range (42, 47)

これにより、範囲の定義が得られます。man ascii与える

42        *
43        +
44        ,
45        -
46        .
47        /

.したがって、完全に合法です。

于 2013-04-13T21:09:02.603 に答える