[英]splitting unicode string into words
我試圖將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:
Aaaaand似乎我應該首先閱讀文檔:
print re.findall(r'(?u)\w+', u"раз два три")[0].encode('utf-8')
會給我:
раз
只是為了確保,這聽起來像是接近它的正確方法嗎?
你實際上是在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
不要錯過我關於打印這些unicode字符串的評論。 通常,如果您要將它們發送到屏幕,文件,電線等,您需要手動將它們編碼為正確的編碼。 當您使用print
,Python會嘗試利用終端的編碼,但只有在有終端時才能這樣做。 因為您通常不知道是否存在,所以您應該只在交互式解釋器中依賴它,並且總是以明確的方式編碼為正確的編碼。
在這種簡單的空白分割方法中,您可能根本不想使用正則表達式而只是使用unicode.split
方法。
>>> u"раз два три".split()
[u'\u0440\u0430\u0437', u'\u0434\u0432\u0430', u'\u0442\u0440\u0438']
你的top(bytestring)示例不起作用,因為re
基本上假設所有字節串都是ASCII語義,但是你的字符串不是。 使用unicode字符串可以為您的字母和區域設置獲得正確的語義。 盡可能使用unicode
而不是str
來表示文本數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.