俄语符号(Python)

2024-05-16 19:21:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个文件中得到一个数据:

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

如果文件包含:

Hi, how are you?

结果将是:

['Hi', 'how', 'are', 'you']

但如果文件包含俄语(即西里尔语符号),则:

Привет, как дела?

在这种情况下,结果是:

['\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)

Tags: 文件fromselfreyouutf8hiare
3条回答

要使用\w+匹配字母数字unicode字符,您应该将同时传递给unicode模式和unicode文本。

  • 在Python2中:

    假设您正在从文件中读取字节(而不是文本),则应该对字节进行解码以获得unicode

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

    ur'(?u)\w+'是一个raw unicode literal。 即使这里不需要,也可以使用原始的unicode/string文本 正则表达式模式通常是一个好的实践——它允许您避免 在某些字符(如\s)之前需要双反斜杠。

    regex模式ur'(?u)\w+'bakes-in the Unicode flag告诉re.findall使\w依赖于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中:

    总的原则是相同的,除了what were ^{}s in Python2 are now ^{}s in Python3,并且不再试图 两者之间的自动转换。所以,再一次假设你是 从文件中读取字节(不是文本),您应该将字节解码为 获取str,并使用strregex模式:

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

    收益率

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

您正在获取一个已经是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 Привет

我的解决方案:

txt = re.findall(r'[А-я]+', data)

俄语字母

相关问题 更多 >