Python正则表达式-从tcpdump解析输出端口

Python正则表达式-从tcpdump解析输出端口,python,regex,port,tcpdump,Python,Regex,Port,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 (?<=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.)\d{,6} 到目前为止,我已经能够删除: 第一IP/第

我试图解析运行“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
(?<=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.)\d{,6}
到目前为止,我已经能够删除:

第一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

(?为什么不用一个正则表达式解析整个过程?使用组,您仍然可以分隔不同的部分。例如:

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"))
重新导入
正则表达式字符串=r'IP(?P\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+>(?P\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+)(?Ptcp{udp)(?P\d{1,5})
ip_regex=re.compile(regex_字符串)
#信息包含tcpdump的输出
对于ip_regex.finditer中的匹配(信息):
打印(匹配组(“第一个ip”))
打印(匹配组(“第二个ip”))
打印(匹配组(“协议”))
打印(匹配组(“端口号”))
如果需要,这是一个测试正则表达式的好网站。

试试这个正则表达式

/^.*?(\d+\.\d+\.\d+\.\d+).*?(\d+\.\d+\.\d+\.\d+).*?([a-z]+)\s(\d+)$/g   

我不知道你为什么一次只取一个你需要的零件。你可以一次全部取下(我也稍微折叠了一下你的IP模式):

IP(?P(?:\d{1,3}){3}\d{1,3})\(?P\d+)>(?P(?:\d{1,3}){3}\d{1,3})\(?P\d+)(?:tc|ud)P(?P\d+)

重新导入
reg=re.compile(r“IP(?P(?:{1,3}){3}\d{1,3})\(?P\d+)>(?P(?:{1,3}){3}\d{1,3})\(?P\d+:(?:tc|ud)P(?P\d+)
对于输入_行中的行:
m=注册匹配(行)
印刷品(m.group(“IP1”))
打印(m.group(“端口1”))
印刷品(m.group(“IP2”))
打印(m.group(“端口2”))
打印(m.group(“尺寸”))

为什么要匹配不同的部分?为什么不制作一个正则表达式,一次填充所有匹配项(ip1、port1、ip2、port2、tcp/udp、size),让自己更轻松?正则表达式的问题可能是您的实现不支持可变宽度lookbehind(换句话说:它们需要有一个预定义的宽度,
{1,3}
不是这个宽度)。顺便说一句,我可以强烈推荐pyparsing而不是regex的非Python混乱
/^.*?(\d+\.\d+\.\d+\.\d+).*?(\d+\.\d+\.\d+\.\d+).*?([a-z]+)\s(\d+)$/g   
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"))