我在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')
没有返回任何错误。
关于字符序列我应该考虑什么?
答案 0 :(得分:6)
短划线-
在方括号[]
中使用时具有特殊含义:它定义了一系列字符。例如,[\s-,]
表示&#34; \s
到,
&#34;中的任何字符。 (这是不可能的)。 但是,如果破折号是方括号中的第一个或最后一个字符,则它没有特殊含义。这就是为什么你的第二个正则表达式是正确的。
答案 1 :(得分:3)
字符-
表示指定字符类中的字符范围,该字符类基于字符的ASCII编号。因此,左侧必须始终具有比右侧更低的ASCII编号。每当你的正则表达式不符合这个标准时,python就会引发错误。在这种情况下,你的范围完全没有意义,因为它的\s-,
意味着空格和逗号之间的任何字符!这显然是错的!
如果你想在字面上使用连字符,你首先在python中有两个选项是使用反斜杠转义字符,如[\w\s\-,]
,第二个是将其置于其他字符的前导或尾随正如你所做的那样。 [\w\s,-]
答案 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]。