Python RegEx底层字符组 - 例如:可以使用[0-A]吗?

时间:2016-03-18 16:06:48

标签: python regex

这是有效的r'[A-Za-z0-9]',这是r'[0-A]' - 我想知道这里匹配的是什么字符类。

Python(2.7)re模块的基础字符表是什么? [A-Z][a-z][0-9]是引用单独的表还是单个整个索引表,例如ASCII?什么定义了要使用的字符表?

我要求了解潜在的机制。

3 个答案:

答案 0 :(得分:3)

你为什么不试试?

>>> import re
>>> p = r'[0-A]'
>>> s = ''.join(chr(i) for i in range(256))
>>> ''.join(re.findall(p, s))
'0123456789:;<=>?@A'
>>> p = r'[0-Z]'
>>> ''.join(re.findall(p, s))
'0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ'

答案 1 :(得分:0)

字符范围将基于ASCII或Unicode,具体取决于Python的版本和字符串的类型。如果您查找字符值,您会看到'9''A'之间存在大量字符,这些字符将包含在您可能不想要的内容中。

>>> r = re.compile('[0-A]')
>>> r.match('0')
<_sre.SRE_Match object at 0x025E8640>
>>> print r.match('0')
<_sre.SRE_Match object at 0x025E85D0>
>>> print r.match('9')
<_sre.SRE_Match object at 0x025E85D0>
>>> print r.match('A')
<_sre.SRE_Match object at 0x025E85D0>
>>> print r.match('Z')
None
>>> print r.match('-')
None
>>> print r.match(':')
<_sre.SRE_Match object at 0x025E85D0>

答案 2 :(得分:0)

默认情况下,在Python 2中,模型是ASCII,但假设它可能很危险(它在启动文件中设置)。 A-Z等不是不同的集合,它们只是常用的集合,尽管字符类中的正确术语。

例如,最好使用多个范围[0-9a-x]

[0-A]是有效的,但也会包含一堆标点符号字符,并且可能会让人们对阅读代码的人感到困惑。

不要将此与\w等类混淆,这些类可能会根据标记设置而改变。