在破折号后使用逗号而不是反转时,正则表达式中的“字符范围错误”

时间:2017-01-15 08:40:42

标签: python regex python-2.7

我在python控制台中尝试过这个命令:

re.match('^\<.+\>([\w\s-,]+)\<.+\>$', 'Carrier-A')

我得到了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/re.py", line 141, in match
    return _compile(pattern, flags).match(string)
  File "/usr/lib/python2.7/re.py", line 251, in _compile
    raise error, v # invalid expression
sre_constants.error: bad character range

但是当我使用时:

re.match('^\<.+\>([\w\s,-]+)\<.+\>$', 'Carrier-A')

没有返回任何错误。

关于字符序列我应该考虑什么?

3 个答案:

答案 0 :(得分:6)

短划线-在方括号[]中使用时具有特殊含义:它定义了一系列字符。例如,[\s-,]表示&#34; \s,&#34;中的任何字符。 (这是不可能的)。 但是,如果破折号是方括号中的第一个或最后一个字符,则它没有特殊含义。这就是为什么你的第二个正则表达式是正确的。

答案 1 :(得分:3)

字符-表示指定字符类中的字符范围,该字符类基于字符的ASCII编号。因此,左侧必须始终具有比右侧更低的ASCII编号。每当你的正则表达式不符合这个标准时,python就会引发错误。在这种情况下,你的范围完全没有意义,因为它的\s-,意味着空格和逗号之间的任何字符!这显然是错的!

如果你想在字面上使用连字符,你首先在python中有两个选项是使用反斜杠转义字符,如[\w\s\-,],第二个是将其置于其他字符的前导或尾随正如你所做的那样。 [\w\s,-]

了解更多http://www.regular-expressions.info/charclass.html

答案 2 :(得分:2)

实际上,-(减号)用于在[]内提供字符范围,这就是使用时出错的原因:

re.search('^\<.+\>([\w\s-,]+)\<.+\>$', 'Carrier-A')好像您说的是\s,的字符范围不正确。

在您的第二个表达式([\w\s,-]+中,没有字符范围,因为-位于字符类的末尾([]之间),这不会产生任何问题。< / p>

为什么字符范围以\s开头或结尾的原因不适用Python's doc引用的内容:

  

\s

     

对于Unicode(str)模式:匹配Unicode空白字符   (包括[\ t \ n \ r \ n \ f \ v],以及许多其他字符   例如,印刷术规定的不间断空间很多   语言)。如果使用ASCII标志,则仅匹配[\ t \ n \ r \ n \ f \ v]   (但是标志会影响整个正则表达式,所以在这种情况下   使用显式[\ t \ n \ r \ n \ f \ v]可能是更好的选择)。对于8位   (字节)模式:匹配被认为是空格的字符   ASCII字符集;这相当于[\ t \ n \ r \ n \ f \ v]。