我从一个文件中获得了一个数据:
words = re.findall(r'[\w]+',self._from.encode('utf8'),re.U)
如果文件包含:
嗨,你好吗?
那么结果将是:
'Hi','how','are','you‘
但如果文件包含俄语(即西里尔符号),则:
Привет,какдела?
在这种情况下,结果是:
'\xd0','\xd1','\xd0','\xd0\xb2\xd0\xb5\xd1','\xd0\xba\xd0','\xd0\xba','\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)
发布于 2013-03-16 18:59:26
要使用\w+
匹配字母数字unicode字符,应该将unicode
模式和unicode
文本都传递给re.findall
。
Python2中的
假设您正在从文件中读取字节(而不是文本),则应对这些字节进行解码以获得unicode
:
uni =‘Привет,какдела?’.decode(‘utf-8’)
ur'(?u)\w+'
是一个raw unicode literal。尽管在这里不是必需的,但是对正则表达式模式使用原始的unicode/字符串文字通常是一种很好的实践--它允许您避免在某些字符(如\s
)之前使用双反斜杠。
正则表达式模式ur'(?u)\w+'
bakes-in the Unicode flag,它告诉re.findall
使\w
依赖于Unicode字符属性数据库。
导入re uni =‘Привет,какдела?’.decode(‘utf-8’)打印(re.findall(ur‘(?u)\w+’,uni))
生成一个包含3个unicode“单词”的列表:
u'\u041f\u0440\u0438\u0432\u0435\u0442',u'\u043a\u0430\u043a',u'\u0434\u0435\u043b\u0430'
除了what were unicode
s in Python2 are now str
s in Python3之外,一般原理是相同的,并且不再尝试在两者之间进行自动转换。因此,再次假设您正在从文件中读取字节(而不是文本),您应该对字节进行解码以获得str
,并使用str
正则表达式模式:
导入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')打印(re.findall(r‘(?u)\w+’,uni))
收益率
的“Привет‘,’как‘,’дела”
发布于 2018-07-15 04:55:59
我的解决方案是:
txt = re.findall(r'[А-я]+', data)
А-я-俄语字母表字母
发布于 2013-03-16 18:59:53
如果省略您得到的编码部分,您将获取一个已经是unicode的字符串,并将其编码为unicode:
line = u"Привет, как дела?"
words = re.findall(r'[\w]+',line ,re.U)
# words = [u'\u041f\u0440\u0438\u0432\u0435\u0442', u'\u043a\u0430\u043a', u'\u0434\u0435\u043b\u0430']
print words[0]
# prints Привет
https://stackoverflow.com/questions/15448274
复制相似问题