次のコードがあります。
import re
r = re.compile(r'[*-/]')
print r.match('.') is not None
を出力True
し、指定された正規表現に一致することを示しますが、'.'
一致しないことを示します。正規表現に明らかな何かが欠けていますか?
私は2.7.3
osxでcpythonを使用しています10.8.2
セット内の 3 つの文字のいずれか[]
が削除された場合、それは機能します。
以下のように書くと、
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
を使用してコンパイルしますre.DEBUG
In [3]: r = re.compile(r'[*-/]', re.DEBUG)
in
range (42, 47)
これにより、範囲の定義が得られます。man ascii
与える
42 *
43 +
44 ,
45 -
46 .
47 /
.
したがって、完全に合法です。