如何让python接受unicode字符0x2000(以及其他)

时间:2015-07-23 23:21:20

标签: python regex unicode

我正在尝试从Python中的字符串中删除某些字符。我有一个我需要删除的字符或字符范围列表,以十六进制表示,如下所示:

SELECT COUNT(*)
FROM score_table
WHERE score > X;

我将此列表转换为正则表达式,如下所示:

- "0x00:0x20"
- "0x7F:0xA0"
- "0x1680"
- "0x180E"
- "0x2000:0x200A"

但是,当我在那里re.sub(u'[\x00-\x20 \x7F-\xA0 \x1680 \x180E \x2000-\x200A]', ' ', my_str) 时,我收到了错误。

我发现Python实际上并没有将\x2000-\x200A解释为字符:

u'\x2000'

它将它视为'x20'(空格)以及其后的其他内容:

>>> '\x2000'
' 00'

x2000是一个有效的unicode字符: http://www.unicodemap.org/details/0x2000/index.html

我希望Python以这种方式对待它,以便我可以使用>>> '\x20blah' ' blah' 将其从字符串中删除。

作为替代方案,我想知道另一种从字符串中删除这些字符的方法。

我感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

在unicode字符串中,您需要指定unicode字符(\uNNNN而不是\xNNNN)。以下作品:

>>> import re
>>> my_str=u'\u2000abc'
>>> re.sub(u'[\x00-\x20 \x7F-\xA0 \u1680 \u180E \u2000-\u200A]', ' ', my_str)
' abc'

答案 1 :(得分:1)

来自文档(https://docs.python.org/2/howto/unicode.html):

  

Unicode文字也可以使用与8位相同的转义序列   字符串,包括\ x,但\ x只需要两个十六进制数字,所以它不能   表达一个任意的代码点。八次逃脱可以达到U + 01ff,   这是八进制777。

>>> s = u"a\xac\u1234\u20ac\U00008000"
... #      ^^^^ two-digit hex escape
... #          ^^^^^^ four-digit Unicode escape
... #                      ^^^^^^^^^^ eight-digit Unicode escape
>>> for c in s:  print ord(c),
...
97 172 4660 8364 32768