0

在 Python 3.3 中,我在正则表达式中使用 Unicode 代码点范围没有问题:

>>> import re
>>> to_delete = '[\u0020-\u0090\ufb00-\uffff]'
>>> s = 'abcdABCD¯˘¸ðﺉ﹅ffl你我他'
>>> print(s)
abcdABCD¯˘¸ðﺉ﹅ffl你我他
>>> print(re.sub(to_delete, '', s))
¯˘¸ð你我他

它干净简单。但是,如果我包含五个十六进制数字的代码点,也就是说,任何高于 的代码点\uffff,例如\u1047f,作为以四个十六进制数字开头的范围的一部分,我会收到一个错误:

>>> to_delete = '[\u0020-\u0090\ufb00-\u1047f]'
>>> print(re.sub(to_delete, '', s))
...
sre_constants.error: bad character range

如果我开始一个新的五位数范围没有错误,但我也没有得到预期的行为:

>>> to_delete = '[\u0020-\u0090\ufb00-\uffff\u10000-\u1047f]'
>>> print(re.sub(to_delete, '', s))
你我他

(这些符号分别是代码点\u10000\u10308\u10192,应该在最后一次re.sub操作中被替换。)


按照接受的答案的说明:

>>> to_delete = '[\u0020-\u0090\ufb00-\uffff\U00010000-\U0001047F]'
>>> print(re.sub(to_delete, '', s))
¯˘¸ð你我他

完美的。丑到极点,但完美。

4

1 回答 1

3

\u仅支持 16 位代码点。您需要使用 32 位版本,\U. 请注意,它需要 8 位数字,因此您必须在前面加上几个 0(例如\U00010D2B)。

来源:http ://docs.python.org/3/howto/unicode.html#unicode-literals-in-python-source-code

于 2013-05-20T20:06:42.363 回答