将unicode字符串拆分为单词

Nik*_*ita 9 python unicode

我试图将Unicode字符串拆分为单词(简单化),如下所示:

print re.findall(r'(?u)\w+', "??? ??? ???")
Run Code Online (Sandbox Code Playgroud)

我期望看到的是:

['???','???','???']
Run Code Online (Sandbox Code Playgroud)

但我真正得到的是:

['\xd1', '\xd0', '\xd0', '\xd0', '\xd0\xb2\xd0', '\xd1', '\xd1', '\xd0']
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑:

如果我u在字符串前面使用:

print re.findall(r'(?u)\w+', u"??? ??? ???")
Run Code Online (Sandbox Code Playgroud)

我明白了:

[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']
Run Code Online (Sandbox Code Playgroud)

编辑2:

Aaaaand似乎我应该首先阅读文档:

 print re.findall(r'(?u)\w+', u"??? ??? ???")[0].encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

会给我:

???
Run Code Online (Sandbox Code Playgroud)

只是为了确保,这听起来像是接近它的正确方法吗?

Mik*_*ham 6

你实际上是在unicode案例中获得了你期望的东西.你只是认为你不是因为你正在查看字符串的重复,而不是打印他们未转义的值这一事实.(这就是列表的显示方式.)

>>> words = [u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438'] 
>>> for w in words:
...     print w # This uses the terminal encoding -- _only_ utilize interactively
... 
???
???
???
>>> u'???' == u'\u0440\u0430\u0437'
True
Run Code Online (Sandbox Code Playgroud)

不要错过我关于打印这些unicode字符串的评论.通常,如果您要将它们发送到屏幕,文件,电线等,您需要手动将它们编码为正确的编码.当您使用时print,Python会尝试利用终端的编码,但只有在有终端时才能这样做.因为您通常不知道是否存在,所以您应该只在交互式解释器中依赖它,并且总是以明确的方式编码为正确的编码.

在这种简单的分裂空白方法中,您可能根本不想使用正则表达式而只是使用该unicode.split方法.

>>> u"??? ??? ???".split()
[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']
Run Code Online (Sandbox Code Playgroud)

你的top(bytestring)示例不起作用,因为re基本上假设所有字节串都是ASCII语义,但是你的字符串不是.使用unicode字符串可以为您的字母和区域设置获得正确的语义.文本数据应尽可能使用unicode而不是表示str.