有效的常规表达不会在Python中编译

时间:2017-07-31 15:16:04

标签: python regex

我试图使用正则表达式过滤一些数据,并提供了一个不在python中编译的示例,即使它似乎是一个有效的表达式。

我已将其缩小为最小形式:

test=re.compile(r'[e-+]')

在Python 3.6.1中调用它,我收到一个错误。我没有收到r'[e+-]'的错误,但我的错误是r'[e-+]' ...

我不明白为什么会收到错误,因为我知道' +'是一个元字符,但在手册中:'元字符在类内没有活动'。

我不知道为什么' - '并且' +'应该重要......

3 个答案:

答案 0 :(得分:2)

在正则表达式中,构造[a-e]匹配' a'''' c'' d' ;或者'。要明确匹配' - ',您必须将其转义\-或将其放在左括号之后或右括号之前。

答案 1 :(得分:1)

字符'+'出现在字母'e'之前,因此范围'+ -e'是有意义的并匹配来自'+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ abcde'`的59个字符中的任何一个,但是'e- +'不允许,因为范围的开始在结束之后。

字符集e+-完全不同。当它是第一个或最后一个字符时,那个只有-提到的三个字符不会形成范围。

答案 2 :(得分:0)

字符组中的

-被视为元字符,并指定字符范围(如果它放在两个其他字符之间),例如ae[a-e]指定范围a, b, c, d, e)。你需要像这样逃避它:

re.compile(r'[e\-+]')

e-+无效,因为它指定e+之间的无效范围,因为后者的ASCII值低于前者。 e+-有效,因为它不在两个其他字符之间,因此不构成范围。