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"раз два три")

我得到:

[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 案例中,您实际上得到了您期望的东西。你只是认为你不是因为奇怪的转义,因为你正在查看字符串的 reprs,而不是不打印它们的未转义值。 (这就是列表的显示方式。)

>>> 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

不要错过我关于打印这些 un​​icode 字符串的评论。通常,如果您要将它们发送到屏幕、文件、网络等,您需要手动将它们编码为正确的编码。当您使用 print 时,Python 会尝试利用您终端的编码,但它只能在有终端的情况下这样做。因为您通常不知道是否有一个,所以您应该只在交互式解释器中依赖它,否则始终显式编码为正确的编码。

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

>>> u"раз два три".split()
[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']

您的顶级(bytestring)示例不起作用,因为 re 基本上假定所有 bytestrings 的语义都是 ASCII,但您的不是。使用 unicode 字符串可以让您获得适合您的字母表和语言环境的正确语义。应尽可能始终使用 unicode 而不是 str 表示文本数据。

关于python - 将unicode字符串拆分为单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7286879/

相关文章:

python - 在 python 中很好地解析多行配置文件

Python heapq 没有按正确的顺序推送?

java - 使用 UTF-8 字符,Java

python - 无法安装 python imposm.parser

python - Mechanize 提交表单错误: Insufficient items with name '10427'

python - SQLAlchemy为大型表定义__repr__的最佳方法

java - 在java中读取unicode txt

ruby-on-rails - "U+2010"!= "-"(或: handling copy/pasted unicode characters with Rails and Postgresql)

c++ - 如何将一个字符(ICU4C)Unicode字符串复制到另一个Unicode字符串?

c++ - 在C++中表示0x00到0x7F范围内的任何通用字符?