Python正则表达式 - 从tcpdump中解析端口
我正在尝试解析运行“tcpdump -nNqt”时给出的信息。
示例输出看起来像这样:
IP 10.0.0.11.60446 > 10.0.0.232.22: tcp 0
IP 10.0.0.232.22 > 10.0.0.11.60446: tcp 176
IP 10.0.0.232.22 > 10.0.0.11.60446: tcp 80
到目前为止,我已经能够提取出:
第一个IP / 第二个IP
(?<=IP\s)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
(?<=\s>\s)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
TCP或UDP / 大小
(?<=:\s)(.{1,3})
(?<=tcp |udp )(\d+)
但是我还没有办法提取出端口号,端口号是IP最后的几个数字。我的尝试没有成功,代码如下:
(?<=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.)\d{,6}
我的表达式有什么问题?有没有其他我没有想到的方法可以做到这一点?
3 个回答
0
0
为什么不直接用一个正则表达式解析整个内容呢?通过使用分组,你仍然可以把不同的部分分开。例如:
import re
regex_string = r'IP (?P<first_ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+) > (?P<second_ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+): (?P<protocol>tcp|udp) (?P<port_num>\d{1,5})'
ip_regex = re.compile(regex_string)
#info contains the output of tcpdump
for match in ip_regex.finditer(info):
print(match.group("first_ip"))
print(match.group("second_ip"))
print(match.group("protocol"))
print(match.group("port_num"))
这里有一个很棒的网站,可以用来测试正则表达式,如果你需要的话。
2
我不太明白你为什么要一个一个地提取你需要的部分。其实你可以一次性把它们都提取出来(我也稍微简化了一下你的IP模式):
IP (?P<IP1>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port1>\d+) > (?P<IP2>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port2>\d+): (?:tc|ud)p (?P<protocol>\d+)
import re
reg = re.compile(r"IP (?P<IP1>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port1>\d+) > (?P<IP2>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port2>\d+): (?:tc|ud)p (?P<size>\d+)")
for line in input_lines:
m = reg.match(line)
print(m.group("IP1"))
print(m.group("Port1"))
print(m.group("IP2"))
print(m.group("Port2"))
print(m.group("size"))