我从文件中获取数据:

words = re.findall(r'[\w]+',self._from.encode('utf8'),re.U)

如果文件包含:
嗨,你好吗?
结果将是:
[你好','你好','是','你']
但如果文件包含俄语(即西里尔文符号),则:
Привет,какдела?
在这种情况下,结果是:
['\xd0'、'\xd1'、'\xd0'、'\xd0\xb2\xd0\xb5\xd1'、'\xd0\xba\xd0',
'\xd0\xba'、'\xd0'、'\xd0\xb5\xd0'、'\xd0']
为什么?世界跆拳道联盟?
我已经添加了:
sys.setdefaultencoding('utf-8')

我使用的是python2.7和linux Ubuntu。
回答:
words = re.findall(r'[\w]+',self._from.decode('utf8'),re.U)
print u" ".join(words)

最佳答案

要使用\w+匹配字母数字Unicode字符,您应该将unicode模式和unicode文本同时传递给re.findall
在python2中:
假设您正在从文件中读取字节(而不是文本),则应解码这些字节以获得一个unicode

uni = 'Привет, как дела?'.decode('utf-8')

ur'(?u)\w+'是一个raw unicode literal
尽管这里不需要,但是使用原始Unicode/String文本
regex模式通常是一个很好的实践——它允许您避免
在某些字符(如\s)之前需要使用双反斜杠。
regex模式告诉ur'(?u)\w+'使re.findall依赖于unicode字符属性数据库。
import re
uni = 'Привет, как дела?'.decode('utf-8')
print(re.findall(ur'(?u)\w+', uni))

生成包含3个Unicode“字”的列表:
[u'\u041f\u0440\u0438\u0432\u0435\u0442',
 u'\u043a\u0430\u043a',
 u'\u0434\u0435\u043b\u0430']

在python3中:
一般原则是相同的,除了这一点,不再有任何尝试
两者之间的自动转换。所以,再次假设你是
从文件中读取字节(不是文本),应将字节解码为
获取一个\w,并使用一个unicoderegex模式:
import re
uni = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xba\xd0\xb0\xd0\xba \xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0?'.decode('utf')
print(re.findall(r'(?u)\w+', uni))

产量
['Привет', 'как', 'дела']

10-07 13:35