telnetlib 期望方法的贪婪量词问题



>我正在尝试从远程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"数据"行(前提是msg的len与0不同),这就是为什么最后一组可能发生>= 0。当针对文件中的数据运行时(因此是脱机分析),此正则表达式将完成其工作。但问题是当这个正则表达式应用于来自 Linux 机器的实时传入条纹时,众所周知,telnetlib 的结果。以贪婪量词结尾的正则表达式的 Telnet.expect() 是不确定的:

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

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

如何重写正则表达式,以免触及telnetlib的缺陷?我想到的不是搜索"数据",而是搜索与"接收"或"传输"不匹配的任何内容,因为这是新消息的开始。

您可以通过附加一个非贪婪指标来使*匹配不贪婪,例如.*?

以下是关于贪婪与懒惰的更多解释:https://javascript.info/regexp-greedy-and-lazy

最新更新