2011-07-14 7 views
2

バイトの行に正規表現のマッチングをかけるには?
たとえばバイナリデータが(0〜10バイト)文字で構成されていることをregexpで確認する方法はありますか?バイト番号のデータのためのPythonの正規表現

data = 0x00 0x05 0x02 0x00 0x03 ...(ない文字列、バイナリデータ)

+0

16進表記を意味しますか? –

+0

私が知っている、私はそれが正規表現を使って行うことができるかどうかを考えていただけです。 pythonのドキュメントでそのような情報を見つけられませんでした。 – Sergey

+1

@mac:Pythonの文字列は基本的にバイト配列であり、バイナリデータを含むことができます。 –

答えて

5

あなたは、文字列がchr(0)chr(10)間の唯一の文字が含まれていることを確認するだけのpython3について

re.match('^[\0-\x0A]*$',data) 

を使用する場合は、バイト列と同じ操作を行うことができます。

re.match(b'^[\0-\x0A]*$',b'\x01\x02\x03\x04') 
+0

ありがとう。 – Sergey

2

これはスペース前に、任意のコードが一致します。

if re.search('[\0-\037]', line): 
    # Contains binary data... 

私はあなたが0-10」によって何を意味するかわからないんだけどbyte "であることを意味していますが、0〜10のバイト値だけを一致させる場合は、上記のコードでに置き換えてください。

0-10は実際にはバイナリデータを示唆する唯一のコードではありません。 \040以下または\0177を超えるものは、通常、バイナリデータを示唆します。

0

あなたの場合すべての文字列が0x00から0x0Bの範囲にあるかどうかを確認したい場合は、正規表現は余計です。

>>> check_range = lambda x: ord(x) in set(range(0x00, 0x0B)) 
>>> s = '\x1\x2\x3\xA' 
>>> s2 = 'abcde' 

>>> print all(check_range(c) for c in s) 
True 
>>> print all(check_range(c) for c in s2) 
False 
>>> 
+0

私はtimeitモジュール、短い文字列s(5つのシンボル)、百万回の実行でそれをテストしました。 Regexpが勝利(3.5倍速く) – Sergey

+0

私自身のテストではこれを克服しています。私はこの回答を削除しますが、あなたのコメントは便利です。いくつかの最適化で、正規表現のバージョンの約1.3倍のスピードにしましたが、それ以下ではありませんでした。 –