2013-04-13 76 views
1

我有以下代碼:可能的錯誤重新

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

它打印True,表示'.'給定的正則表達式,它不匹配。我在正則表達式中錯過了一些明顯的東西嗎?

我使用CPython的2.7.3在OSX 10.8.2

如果任何[]集合內的三個字符被刪除,它的工作原理。

+2

特殊字符在集合內失去意義:http://docs.python.org/2/li brary/re.html#regular-expression-syntax – sobel

回答

11

當你寫下面,

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

採用-真正含義匹配*/之間的任何字符。如果你看看ascii表,

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

這就是爲什麼它匹配.字符。您當前的正則表達式也將匹配,

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

要糾正的正則表達式,使其只匹配*-/,你能逃脫-這樣,

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

那麼你沒有得到匹配.

>>> print r.match('.') is not None 
False 
+3

你也可以把'-'最後:'r'[*/- ]''。 –

+0

@PavelAnossov另一個好的解決方案 – Jared

+1

...或者首先'[ - * /]'。 –

6

re.DEBUG使用

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

其給出的範圍內的定義編譯它。 man ascii給出

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

其包括.因此完全合法的。