0

いくつかのデータを解析しようとしていますが、同じものにPython正規表現を使用する必要があります。以下のようなデータ全体を抽出することを想定しています。

PPP Link Control Protocol
  Code: Termination Request (0x05)
  Identifier: 0x03
  Length: 45
  Data (41 bytes)

0000  58 b0 35 f3 95 81 00 d0 bc 3d 8c 00 08 00 45 00   X.5......=....E.
0010  00 55 73 1b 00 00 f9 2f 07 18 11 e0 58 9d 11 db   .Us..../....X...
0020  ca ee 30 81 88 0b 00 31 0b 86 00 00 00 0b 00 00   ..0....1........
0030  00 09 ff 03 c0 21 05 03 00 2d 4d 50 50 45 20 72   .....!...-MPPE r
0040  65 71 75 69 72 65 64 20 62 75 74 20 70 65 65 72   equired but peer
0050  20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69    negotiation fai
0060  6c 65 64                                          led

データには任意の特殊文字を含めることができます。すべての特殊文字を含めることができる正規表現パターンを探しています。これにより、各特殊文字を正規表現パターンに含める必要がなくなります。
たとえば、すべてのアルファベットとアンダースコアに「\w」があります。すべての桁に対して'\d'があります。上記のように情報を抽出するための最も簡単な正規表現パターンは何でしょうか?

編集

期待される出力は次のとおりです。

0000  58 b0 35 f3 95 81 00 d0 bc 3d 8c 00 08 00 45 00   X.5......=....E.
0010  00 55 73 1b 00 00 f9 2f 07 18 11 e0 58 9d 11 db   .Us..../....X...
0020  ca ee 30 81 88 0b 00 31 0b 86 00 00 00 0b 00 00   ..0....1........
0030  00 09 ff 03 c0 21 05 03 00 2d 4d 50 50 45 20 72   .....!...-MPPE r
0040  65 71 75 69 72 65 64 20 62 75 74 20 70 65 65 72   equired but peer
0050  20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69    negotiation fai
0060  6c 65 64                                          led
4

2 に答える 2

1

入力と予想される出力に基づいて、複雑な正規表現が必要な理由がわかりません。行ごとに処理して、最初の列の数字を確認できます。

import re

packet  = open('/tmp/packet', 'r').read()
lines   = packet.split("\n")
pattern = re.compile(r'^\d+')
matches = [ line for line in lines if re.match(pattern, line) ]

print "\n".join(matches)

あなたの出力を生成します:

0000  58 b0 35 f3 95 81 00 d0 bc 3d 8c 00 08 00 45 00   X.5......=....E.
0010  00 55 73 1b 00 00 f9 2f 07 18 11 e0 58 9d 11 db   .Us..../....X...
0020  ca ee 30 81 88 0b 00 31 0b 86 00 00 00 0b 00 00   ..0....1........
0030  00 09 ff 03 c0 21 05 03 00 2d 4d 50 50 45 20 72   .....!...-MPPE r
0040  65 71 75 69 72 65 64 20 62 75 74 20 70 65 65 72   equired but peer
0050  20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69    negotiation fai
0060  6c 65 64                                          ed
于 2012-06-19T06:28:46.233 に答える
0

.は、使用したプログラムの出力で制御文字を置き換えるために使用されると思うので、それらを処理する必要はありません。

この裸の正規表現は、結果の一部であるすべての行を提供します。これを機能させるには、DOTALL オプションをオフにして、IGNORECASE オプションをオンにしてください。これをプラグインして機能させる場合、いくつかの文字をエスケープする必要がある場合もありfindallます。

[\da-f]+\s+(?:[\da-f]{2}\s+)+.*
于 2012-06-19T05:55:20.877 に答える