【发布时间】:2019-11-01 11:24:13
【问题描述】:
我正在尝试从具有大致这种格式的远程 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 的不足不被击中?我想不搜索“数据”,而是搜索与“接收”或“传输”不匹配的任何内容,因为这是新消息的开始。
【问题讨论】:
-
更好的是:为传入的数据编写一个小型解析器。如果您需要帮助,请提供一些真实世界的输入以及您想要保留的内容。