Python 将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"раз

我尝试将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"раз два три")
我得到:

[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 interactive
print
这个非常狭隘的例子)。我的意思不是说你应该在你的高级代码中反复调用
encode
decode
。使用
codecs.open
在Python2中和非
在Python3中或任何其他封装编码的东西返回的类似文件的对象,与
json
sqlite
模块一样,它们也是显式的。我想说的(显然我没有成功)不是你应该一直亲自调用
str.decode
/
unicode.encode
(Python 3
bytes.decode
/
str.encode
),但是,您不应该依赖隐式编码。拉出所有
\w+
字符串和在
\s+
上拆分是有区别的。显然,您希望在这两种情况下都启用
(?u)
。打印前不要进行手动编码。打印到具有编码的字符流,而不是不具有编码的字节流。用于Python中的Unicode正则表达式。不要使用
re
:它不能正常工作。
>>> u"раз два три".split()
[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']