1

我有以下代码:

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

它打印True,表示它'.'与给定的正则表达式匹配,但它不匹配。我在正则表达式中遗漏了一些明显的东西吗?

2.7.3在 osx 上使用 cpython10.8.2

如果[]删除集合中的三个字符中的任何一个,它就会起作用。

4

2 回答 2

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>

要更正正则表达式使其仅匹配*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 回答