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

数据可以有任何特殊字符。我正在寻找一些可以包含所有特殊字符的 reg ex 模式,这样我就不必将它们中的每一个都包含在我的 reg ex 模式中。
例如,我们对所有字母和下划线都有 '\w'。对于所有数字,我们都有'\d'。如上所示,提取信息的最简单的 reg ex 模式是什么?

编辑

预期输出为:

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 回答