2017-05-05 56 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

你也可以只使連字符成爲字符類中的第一個或最後一個字符,所以它不可能指示範圍;那麼這是從字面上理解的。 –