web-dev-qa-db-ja.com

バイナリファイルを解析する正規表現?

バイナリデータとテキストデータを混在させたファイルを持っています。正規表現で解析したいのですが、次のエラーが発生します。

TypeError: can't use a string pattern on a bytes-like object

このメッセージは、Pythonがバイナリファイルを解析する必要がないことを意味していると思います。"rb"フラグを使用してファイルを開いています。

Pythonで正規表現を使用してバイナリファイルを解析するにはどうすればよいですか?

編集:私はPython 3.2.0を使用しています

32
DonkeyMaster

Python 3を使用すると思います。

1。バイナリモードでファイルを開くのは簡単ですが微妙です。テキストモードで開くとの唯一の違いは、modeパラメータに 'b'文字が含まれていることです。

........

4.ただし、1つの違いがあります。binary streamオブジェクトにはエンコード属性がありません。それは理にかなっていますか? 文字列ではなくバイトを読み取る(または書き込む)ため、Pythonの変換はありません。

http://www.diveintopython3.net/files.html#read

次に、Python 3で、ファイルからのバイナリストリームはバイトのストリームであるため、ファイルからのストリームを分析する正規表現は、シーケンスではなくバイトのシーケンスで定義する必要があります。文字。

Python 2の場合、文字列は文字エンコーディングが個別に追跡されるバイトの配列でした。文字エンコーディングを追跡するためにPython 2が必要な場合は、代わりにUnicode文字列(u '')を使用する必要がありました。ただしPython 3では、文字列は常にPython 2と呼ばれ、Unicode文字列と呼ばれます—つまり、Unicode文字の配列(バイト長が異なる可能性がある)。

http://www.diveintopython3.net/case-study-porting-chardet-to-python-3.html

そして

Python 3では、すべての文字列はUnicode文字のシーケンスです。Python UTF-8でエンコードされた文字列、またはPython CP-1252でエンコードされた文字列はありません。 「この文字列はUTF-8ですか?」という質問は無効です。UTF-8は、文字をバイトのシーケンスとしてエンコードする方法です。文字列を特定の文字エンコードのバイトのシーケンスに変換する場合は、 Python 3はそれを助けることができます。

http://www.diveintopython3.net/strings.html#boring-stuff

そして

4.6文字列とバイト数#バイトはバイトです。文字は抽象化です。 Unicode文字の不変のシーケンスは文字列と呼ばれます。 0から255までの数値の不変のシーケンスは、バイトオブジェクトと呼ばれます。

....

1。バイトオブジェクトを定義するには、b ''“バイトリテラル”構文を使用します。バイトリテラル内の各バイトは、ASCII文字または\ x00から\ xff(0–255)までのエンコードされた16進数です。

http://www.diveintopython3.net/strings.html#boring-stuff

したがって、次のように正規表現を定義します

pat = re.compile(b'[a-f]+\d+')

ではなく

pat = re.compile('[a-f]+\d+')

ここでより多くの説明:

15.6.4。バイトのようなオブジェクトでは文字列パターンを使用できません

27
eyquem

あなたのre.compile最初のbytesで示されるbオブジェクトを使用する必要があります:

r = re.compile(b"(This)")

これは、Python 3は、文字列とバイトの違いにうるさいということです。

29
Scott Griffiths