[^ [:print:]]和[[:cntrl:]]之间有区别吗

时间:2014-08-13 20:50:58

标签: python regex

尝试确定上面提到的POSIX字符组之间是否存在功能差异,或者更具体地说,确定以下两种模式之间是否存在功能差异:

r'[^[\x20-\x7E]]'  # Match All non-printable
r'[\x00-\x1F\x7F]'  # Match control characters 

1 个答案:

答案 0 :(得分:1)

我不确定POSIX组(Python的正则表达式引擎无论如何也不支持它们),但是

r'[^[\x20-\x7E]]'

肯定是错的(应该是r'[^\x20-\x7E]'匹配远远超过

r'[\x00-\x1F\x7F]'

因为后者只考虑ASCII字符,而前者也会匹配代码点126之上的任何内容:

>>> r1 = re.compile(r'[^\x20-\x7E]')
>>> r2 = re.compile(r'[\x00-\x1F\x7F]')
>>> r1.match("ä")
<_sre.SRE_Match object; span=(0, 1), match='ä'>
>>> r2.match("ä")
>>>

为了扩展我的观点,为什么你的正则表达式r'[^[\x20-\x7E]]'有问题:它匹配的字母既不是开头方括号,也不是ASCII 20和ASCII 126之间的范围(已包含[无论如何),然后是一个文字结束括号:

>>> r1 = re.compile(r'[^[\x20-\x7E]]')
>>> r1.match("\x00")
>>> r1.match("\x00]")
<_sre.SRE_Match object; span=(0, 2), match='\x00]'>