14

我从文件中获取数据:

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

6 回答 6

10

要用于\w+匹配字母数字unicode字符,您应该将模式和文本传递给.unicodeunicodere.findall

  • 在 Python2 中:

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

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

    ur'(?u)\w+'是一个原始的 unicode 文字。尽管这里没有必要,但对正则表达式模式使用原始 unicode/字符串文字通常是一个好习惯——它允许您避免在某些字符之前需要双反斜杠,例如\s.

    正则表达式模式ur'(?u)\w+' 包含 Unicode 标志,它告诉依赖于 Unicode 字符属性数据库re.findall\w

    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 中:

    大体原理是一样的,只是Python2 中的sunicode现在 Python3 中str的 s,并且不再尝试在两者之间进行自动转换。因此,再次假设您正在从文件中读取字节(而不是文本),您应该解码字节以获得 a 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))
    

    产量

    ['Привет', 'как', 'дела']
    
于 2013-03-16T10:59:26.317 回答
4

我的解决方案:

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

А-я - 俄语字母

于 2018-07-14T20:55:59.050 回答
1

如果您省略了您得到的编码部分,您正在获取一个已经是 unicode 的字符串并将其编码为 un​​icode:

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 Привет
于 2013-03-16T10:59:53.150 回答
1

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

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

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

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

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

于 2021-04-12T11:02:23.003 回答
0

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

于 2013-03-16T10:53:48.630 回答
0

Ё 字母的俄语字母解决方案(不包括在 А-Я 范围内)

import re

text = 'Ё-моё Привет! 2121 как дела?'

re.findall(r'[А-яЁё]+', text)
# => ['Ё', 'моё', 'Привет', 'как', 'дела']
于 2022-01-05T21:11:47.747 回答