telnetlib的Expect方法的贪婪量词问题

时间:2019-06-18 19:03:28

标签: python regex

我正试图从具有这种格式的远程Linux机器上捕获消息:

.*transmit message cmd: 0x1234, len: 20,
.*data: 00000000: 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
.*data: 00000010: 00 11 22 33 
.*receive message cmd: 0x1234, len: 0,
.*transmit message cmd: 0x1234, len: 0,

我创建了一个正则表达式,可以捕获我想要的(一条消息,无论是发送还是接收消息),原理上是这样的:

 r'^.*(receive|transit).*message.*cmd(?P<cmd> [\da-fA-F]+,.*len(?P<len> \d+,(?:\n.*data:.*:.*)*'

带有re.M标志。

找到包含“接收”或“发送”和“消息”的任何行,并可能在其后跟随N条“数据”行(假设味精的len不同于0),这就是为什么最后一组会发生> =0。对文件中的数据运行(因此进行脱机分析)时,此正则表达式将执行其工作。但是问题是当将此正则表达式应用于来自Linux机器的实时传入条带时,众所周知,telnetlib.Telnet.expect()结果以贪婪的量词结尾的regex是不确定的:

  

如果正则表达式以贪婪匹配(例如。*)结尾,或者   一个以上的表达式可以匹配相同的输入,结果是   不确定的,可能取决于I / O时序。

https://docs.python.org/2/library/telnetlib.html

如何重写正则表达式,从而避免telnetlib的不足?我考虑过不搜索“数据”,而是搜索不匹配“接收”或“发送”的任何内容,因为这是新消息的开始。

1 个答案:

答案 0 :(得分:0)

您可以通过添加非贪婪指示符(例如*

来使.*?与非贪婪匹配

这里有更多关于贪婪与懒惰的解释:https://javascript.info/regexp-greedy-and-lazy