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))
¯˘¸ð你我他
すっきりとシンプルです。しかし、16 進数 5 桁のコードポイントを含めると、つまりのように、16 進数 4 桁で始まる範囲の一部\uffff
としてよりも大きいものを含めると、エラーが発生します。\u1047f
>>> to_delete = '[\u0020-\u0090\ufb00-\u1047f]'
>>> print(re.sub(to_delete, '', s))
...
sre_constants.error: bad character range
新しい 5 桁の範囲を開始してもエラーは発生しませんが、期待される動作も得られません。
>>> 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))
¯˘¸ð你我他
完全。極端に醜いですが、完璧です。