2017-05-05 55 views
2

我观察到以下行为在Python 2.7.5:Python re:为什么[,-_]匹配“=”?

>>> import re 
>>> re.match(r'[,-_]', '=') # This matches 
<_sre.SRE_Match object at 0x7f24d4981308> 
>>> re.match(r'[-,_]', '=') # This doesn't match 
>>> re.match(r'[-_,]', '=') # Nor does this 

有人能解释我所看到的吗?我似乎无法找到任何关于,-_在python正则表达式(或原始字符串)中的特殊用法。

+0

[preg \ _match用户名验证正则表达式允许>和<尽管这些字符未被列入白名单]的可能重复(http://stackoverflow.com/questions/9996951/preg-match-username-validation-regex-allows-and -despite-those-characters-not) – Xufox

回答

8

这是相同的成语如[A-Z]相匹配一切从A到Z在这种情况下,它将匹配从,(ASCII#44)_一切(ASCII#95),其中包括=(ASCII#61 )。

查看full ASCII table

2

因为连字符(-)定义了一个范围,并且=在ASCII表中的,_之间。您需要将其转义,以便正则表达式引擎将其视为文字连字符,如r'[,\-_]'。原始字符串被解释器跳过,但不被视为来自正则表达式引擎的文字,这就是为什么您需要转义特殊字符的原因。

+2

你也可以只使连字符成为字符类中的第一个或最后一个字符,所以它不可能指示范围;那么这是从字面上理解的。 –