python中特殊字符的正则表达式难度

时间:2012-06-19 05:10:02

标签: python regex

我正在尝试解析一些数据,我需要使用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'。如上所示,提取信息最简单的注册模式是什么?

修改

预期输出为:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为.用于替换您使用的任何程序的输出中的任何控制字符,因此我们不必处理它们。

这个裸正则表达式将给出结果中的所有行。请关闭DOTALL选项并打开IGNORECASE选项以使其生效。将此插入findall函数时,您可能还需要转义几个字符。

[\da-f]+\s+(?:[\da-f]{2}\s+)+.*