Проблема жадного квантификатора с помощью метода ожидания telnetlib - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь перехватить сообщения с удаленной машины 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? Я думал не о поиске «данных», а о том, что не соответствует «получению» или «передаче», так как это начало нового сообщения.

1 Ответ

0 голосов
/ 18 июня 2019

Вы можете сделать * совпадения не жадными, добавив не жадный индикатор, например, .*?

Вот еще несколько объяснений жадных и ленивых: https://javascript.info/regexp-greedy-and-lazy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...