无法在 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')
使用 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')