我试图使用正则表达式过滤一些数据,并提供了一个不在python中编译的示例,即使它似乎是一个有效的表达式。
我已将其缩小为最小形式:
test=re.compile(r'[e-+]')
在Python 3.6.1中调用它,我收到一个错误。我没有收到r'[e+-]'
的错误,但我的错误是r'[e-+]'
...
我不明白为什么会收到错误,因为我知道' +'是一个元字符,但在手册中:'元字符在类内没有活动'。
我不知道为什么' - '并且' +'应该重要......
答案 0 :(得分:2)
在正则表达式中,构造[a-e]
匹配' a'''' c'' d' ;或者'。要明确匹配' - ',您必须将其转义\-
或将其放在左括号之后或右括号之前。
答案 1 :(得分:1)
字符'+'出现在字母'e'之前,因此范围'+ -e'是有意义的并匹配来自'+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_
abcde'`的59个字符中的任何一个,但是'e- +'不允许,因为范围的开始在结束之后。
字符集e+-
完全不同。当它是第一个或最后一个字符时,那个只有-
提到的三个字符不会形成范围。
答案 2 :(得分:0)
-
被视为元字符,并指定字符范围(如果它放在两个其他字符之间),例如a
和e
([a-e]
指定范围a, b, c, d, e
)。你需要像这样逃避它:
re.compile(r'[e\-+]')
e-+
无效,因为它指定e
和+
之间的无效范围,因为后者的ASCII值低于前者。 e+-
有效,因为它不在两个其他字符之间,因此不构成范围。