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

英数字のUnicode\w+文字の照合に使用するには、パターンとテキストの両方を に渡す必要があります。unicodeunicodere.findall

  • Python2 の場合:

    ファイルから (テキストではなく) バイトを読み取っていると仮定すると、バイトをデコードして次の値を取得する必要がありますunicode

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

    ur'(?u)\w+'生のUnicode リテラルです。ここでは必須ではありませんが、正規表現パターンに未加工の Unicode/文字列リテラルを使用することは、一般的には良い方法です\s

    正規表現パターンは、Unicode 文字プロパティ データベースに依存するように指示するur'(?u)\w+' Unicode フラグを組み込みます。re.findall\w

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

    3つのユニコード「単語」を含むリストを生成します:

    [u'\u041f\u0440\u0438\u0432\u0435\u0442',
     u'\u043a\u0430\u043a',
     u'\u0434\u0435\u043b\u0430']
    
  • Python3 の場合:

    Python2の s が Python3 の s になり、2 つの間の自動変換が試行されなくなったことunicodestrを除いて、一般的な原則は同じです。したがって、ファイルから (テキストではなく) バイトを読み取ると仮定すると、バイトをデコードして を取得し、正規表現パターン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 に答える
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 Привет
于 2013-03-16T10:59:53.150 に答える
0

が文字列の場合self._fromは、(フラグを使用して)unicodeに直接渡す必要があります。utf8 でエンコードされた文字列の場合は、文字列にする必要があります。ASCII 以外の文字列を に渡すべきではありません。re.findallre.Ustrdecodeunicodestrre

于 2013-03-16T10:53:48.630 に答える
0

Ё 文字を使用したロシア語アルファベットのソリューション (А-Я の範囲には含まれません)

import re

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

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