2016-09-01 6 views
3

RegExを使用して、バイト文字列のBGPメッセージと一致させています。文字列はこのように見ている例バイト:Python 3でのバイトコードの正規表現

b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04'

の\ XFF(8回)は、単一のメッセージを開始するには、「マジック」として使用されています。今私はそれらのそれぞれを解析するためにメッセージを分割したいと思います。

messages = re.split(b'\xff{8}', payload) 

マッチングはうまくいきますが、メッセージ配列に空のフィールドがいくつかあります。

b'' 
b'' 
b'001304' 
b'' 
b'' 
b'001304' 

誰かがこの動作を説明できますか?それぞれの(正しい分割された)メッセージの間に2つの空のフィールドがあるのはなぜですか。より大きなバイト文字列では、各メッセージの間に空白フィールドが1つしかないことがあります。また

messages = re.split(b'(?:\xff){8}', payload) 
         ^^^ ^

、単に複数の連続する8 \xff sが最後にあなたの文字列にあります。

+0

多分 'messages = re.split(b '(?:\ xff){8}'、ペイロード)'? –

答えて

1

は、私はあなただけで8 f S(例えば\xfffffffff)末尾のない\xffの8つの出現を、一致させたいと思います。

messages = re.split(b'(?:(?:\xff){8})+', payload) 

ただし、データの最初に一致するものが見つかった場合は、最初の要素が空になります。あなたは、分割前の初めに一部を削除することがあります。

もつとも
messages = re.split(b'(?:(?:\xff){8})+', re.sub(b'^(?:(?:\xff){8})+', b'', payload)) 

、最高のアイデアは、単にリスト内包またはFilterkudos for testing goes to you)で空の要素を削除することです:

​​

更新を参照してくださいPython 3 demo

+0

修正してください。しかし、あなたの変更された正規表現は、正しいマッチの間の同じ空のフィールドになります。 – iLLogical

+1

私はこれをどのように解決できるかを段階的に示してみました。最後のコード例と[IDEONEのデモ](https://ideone.com/HM0bXs)を参照してください。 –

+0

私はdownvoterは 're.subを好きではなかったと思う。それは有効な考えですが、実際にはそれをスキップしてリストの理解を使用することができます。私は答えを更新しました。 –