在 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))
¯˘¸ð你我他
完美的。丑到极点,但完美。