我从文件中获取数据:
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
,并使用一个unicode
regex模式: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))
产量
['Привет', 'как', 'дела']