re中的俄语符号(Python)

时间:2013-03-16 10:42:29

标签: python regex utf-8

我从文件中获取数据:

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)

5 个答案:

答案 0 :(得分:9)

要使用\w+来匹配字母数字 unicode 字符,您应该将两个 unicode模式和unicode文本传递给{{ 1}}。

  • 在Python2中:

    假设您正在从文件中读取字节(而不是文本),您应该解码字节以获得re.findall

    unicode

    uni = 'Привет, как дела?'.decode('utf-8') raw unicode literal。 即使这里没有必要,也可以使用原始的unicode / string文字 正则表达式模式通常是一个很好的做法 - 它可以让你避免 在某些字符之前需要双反斜杠,例如ur'(?u)\w+'

    正则表达式模式\s bakes-in the Unicode flag,它告诉ur'(?u)\w+'使re.findall依赖于Unicode字符属性数据库。

    \w

    产生一个包含3个unicode“words”的列表:

    import re
    uni = 'Привет, как дела?'.decode('utf-8')
    print(re.findall(ur'(?u)\w+', uni))
    
  • 在Python3中:

    一般原则是相同的,除了what were unicodes in Python2 are now strs in Python3,并且不再有任何尝试 两者之间自动转换。所以,再假设你是 从文件中读取字节(不是文本),你应该将字节解码为 获取[u'\u041f\u0440\u0438\u0432\u0435\u0442', u'\u043a\u0430\u043a', u'\u0434\u0435\u043b\u0430'] ,并使用str正则表达式模式:

    str

    产量

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

答案 1 :(得分:1)

您正在使用已经是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 Привет

答案 2 :(得分:1)

我的解决方案:

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

А-я-俄语字母

答案 3 :(得分:0)

如果self._fromunicode字符串,则应将其直接传递给re.findall(带re.U标记)。如果它是utf8编码的str字符串,则需要decode将其转换为unicode字符串。您不应将非ascii str字符串传递给re

答案 4 :(得分:0)

请参阅 UTF Cyrillic 块以精确定义正则表达式:

大多数代码点都在一个范围内,但有些不在:

re.compile('[А-Яа-яЁё]+')

re.fullmatch("[А-Яа-яЁё ]+", "Ёжик в тумане")

此外,您可能希望根据需要包含 Ѣ ѣ (Ять) 或其他旧符号。