Я пытаюсь перехватить сообщения с удаленной машины 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.
То есть найти любую строку, содержащую «приём» или «передача» и «сообщение», за которой потенциально могут следовать N строк «данных» (при условии, что значение msg отличается от 0), поэтому может возникнуть последняя группа> = 0. При запуске с данными из файла (таким образом, анализ в автономном режиме), это регулярное выражение выполняет свою работу. Но проблема в том, что это регулярное выражение применяется к живой входящей полосе, поступающей с компьютера с Linux, поскольку известно, что результат telnetlib.Telnet.expect () с регулярным выражением, заканчивающимся жадным квантификатором, недетерминирован:
Если регулярное выражение заканчивается жадным совпадением (например, *) или если
более чем одно выражение может соответствовать одному и тому же вводу, результаты
недетерминированный и может зависеть от времени ввода / вывода.
https://docs.python.org/2/library/telnetlib.html
Как переписать регулярное выражение, чтобы избежать недостатка telnetlib? Я думал не о поиске «данных», а о том, что не соответствует «получению» или «передаче», так как это начало нового сообщения.