Python 将unicode字符串拆分为单词
我尝试将Unicode字符串拆分为单词(过于简单),如下所示:Python 将unicode字符串拆分为单词,python,unicode,Python,Unicode,我尝试将Unicode字符串拆分为单词(过于简单),如下所示: print re.findall(r'(?u)\w+', "раз два три") 我希望看到的是: ['раз','два','три'] 但我真正得到的是: ['\xd1', '\xd0', '\xd0', '\xd0', '\xd0\xb2\xd0', '\xd1', '\xd1', '\xd0'] 我做错了什么 编辑: 如果我在字符串前面使用u: print re.findall(r'(?u)\w+', u"раз
print re.findall(r'(?u)\w+', "раз два три")
我希望看到的是:
['раз','два','три']
但我真正得到的是:
['\xd1', '\xd0', '\xd0', '\xd0', '\xd0\xb2\xd0', '\xd1', '\xd1', '\xd0']
我做错了什么
编辑:
如果我在字符串前面使用u
:
print re.findall(r'(?u)\w+', u"раз два три")
我得到:
[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']
编辑2:
aaaa看来我应该先看一下文档:
print re.findall(r'(?u)\w+', u"раз два три")[0].encode('utf-8')
将给我:
раз
不过,为了确保这一点,这听起来像是一种正确的方法吗?在unicode的情况下,您实际上得到了您所期望的东西。您只是认为这不是因为奇怪的转义,因为您正在查看字符串的repr,而不是打印它们未转义的值。(这就是列表的显示方式。) 不要错过我关于打印这些unicode字符串的评论。通常,如果要将它们发送到屏幕、文件、有线电视等,则需要手动将它们编码为正确的编码。当您使用
print
时,Python试图利用终端的编码,但它只能在有终端的情况下这样做。因为您通常不知道是否有,所以您应该在交互式解释器中仅依赖于此,否则应始终显式地编码到正确的编码
在这种基于空格的简单拆分方法中,您可能根本不想使用regex,而只是简单地使用unicode.split
方法
>>> u"раз два три".split()
[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']
您的top(bytestring)示例不起作用,因为
re
基本上假定所有bytestring的语义都是ASCII,但您的示例却不是。使用unicode字符串可以为字母表和语言环境获取正确的语义。尽可能使用unicode
而不是str
来表示文本数据。不,我认为不应该手动编码。您应该在输出端设置编码。如果将Matthew Barnett的regex
用于re
,那么许多Unicode问题就会消失。如果您在使用Python3的广泛构建中使用regex
,您的Unicode困难会大大改善。违反这三项要求中的任何一项,你都会遭受损失;违反不止一个,您将遭受更多的痛苦。@tchrist,不,您应该始终显式地处理编码和解码,而不是像示例中那样依赖隐式编码(除了Python 2 interactiveprint
这个非常狭隘的例子)。我的意思不是说你应该在你的高级代码中反复调用encode
或decode
。使用codecs.open
在Python2中和非在Python3中或任何其他封装编码的东西返回的类似文件的对象,与json
或sqlite
模块一样,它们也是显式的。我想说的(显然我没有成功)不是你应该一直亲自调用str.decode
/unicode.encode
(Python 3bytes.decode
/str.encode
),但是,您不应该依赖隐式编码。拉出所有\w+
字符串和在\s+
上拆分是有区别的。显然,您希望在这两种情况下都启用(?u)
。打印前不要进行手动编码。打印到具有编码的字符流,而不是不具有编码的字节流。用于Python中的Unicode正则表达式。不要使用re
:它不能正常工作。
>>> u"раз два три".split()
[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']