无法在 Python 2.7 re 中编译 8 位 unicode 正则表达式范围

Cannot compile 8 digit unicode regex ranges in Python 2.7 re

使用 Python 2.7,重新

我正在尝试编译 unicode 字符 类。我可以使用 4 位数字范围 (u'\uxxxx') 但不是 8 位数字 (u'\Uxxxxxxxx').I

以下作品:

re.compile(u'[\u0010-\u0012]')

以下没有:

re.compile(u'[\U00010000-\U00010001]')

结果错误是:

Traceback (most recent call last): File "", line 1, in File "C:\Python27\lib\re.py", line 190, in compile return _compile(pattern, flags) File "C:\Python27\lib\re.py", line 242, in _compile raise error, v # invalid expression error: bad character range

这似乎是 8 位数范围的问题,因为以下工作:

re.compile(u'\U00010000')

单独的问题,我是 Whosebug 的新手,我真的很困惑如何 post 问题。我希望 Trackback 出现在多行,而不是一行。我还希望能够粘贴从解释器复制的内容,但这 UI 使 '>>>'

变得一团糟

不知道如何在评论编辑问题中添加这个。

我真正要编译的表达式是:

re.compile(u'[\U00010000-\U0010FFFF]')

就扩展建议的解决方法而言,使用 list(u'[\U00010000-\U0010FFFF]') 扩展它看起来非常棘手:

>>> list(u'[\U00010000-\U0010FFFF]')
[u'[', u'\ud800', u'\udc00', u'-', u'\udbff', u'\udfff', u']']

根据编译选项,Python2 可能将 Unicode 字符串存储为 UTF-16 代码单元,因此 \U00010000 实际上是一个双代码单元字符串:

>>> list(u'[\U00010000-\U00010001]')
[u'[', u'\ud800', u'\udc00', u'-', u'\ud800', u'\udc01', u']']

正则表达式解析器因此看到字符 class 包含 \udc00-\ud800,这是一个 "bad character range"。在这种情况下,除了显式匹配代理对(确保 sys.maxunicode == 0xffff 之后)之外,我想不出其他解决方案:

>>> r = re.compile(u'\ud800[\udc00-\udc01]')
>>> r.match(u'\U00010000')
<_sre.SRE_Match object at 0x10cf6f440>
>>> r.match(u'\U00010001')
<_sre.SRE_Match object at 0x10cf4ed98>
>>> r.match(u'\U00010002')
>>> r.match(u'\U00020000')