Python - последовательное чтение и использование регулярных выражений для группировки данных - PullRequest
1 голос
/ 24 октября 2019

Я читаю данные из последовательной линии, используя базовый код Python. Я сохраняю эти данные в локальной переменной, а затем использую re.search для поиска конкретных значений. Затем я группирую данные, используя match.group, который по большей части работает хорошо.

Моя проблема в том, что иногда я получаю данные из другого места в последовательных данных, которые неверны, исходя из шаблона, который я ищу. Есть ли способ сделать это более надежным?

Некоторые фрагменты из функции python:

ser = serial.Serial('COM' + port, 115200, timeout=0, parity=serial.PARITY_NONE, 
stopbits=serial.STOPBITS_ONE, rtscts=0)

data = ser.read(9999)

ser.close()

match =  re.search(r'Result1:({0}).*(\\r\\n)Result2:(\d)(\d)(\\r\\n)Result3:(\d*)'.format(Result1), 
str(data))

Result1= match.group(1)
Result2= match.group(3) + match.group(4)
Result3= (match.group(6))

Как выглядят последовательные данные, когда код выполняется и возвращает ожидаемый результат:

Результат1: 11111111 (0x11111111) \ r \ nРезультат2: 09 \ r \ nРезультат3: 1000 \ r \ nРезультат 4: 1\ r \ nРезультат5: 20 Результат6: 1 \ r \ nРезультат7: 02 \ r \ n [То есть датаграмма РФ: 141490 \ r \ n \ Result1: 11111111 (0x11111111) \ r \ nРезультат2: 09 \ r \ nResult3: 1000

Как выглядят последовательные данные, когда код выполняется и возвращает неожиданный результат:

Результат1: 11111111 (0x11111111) \ r \ nРезультат2: 09 \ r \ nРезультат3: 1000 \ r \ nРезультат4: 1 \ r \ nРезультат5: 20 Результат6: 1 \ r \ nРезультат7: 02 \ r \ n [То есть датаграмма РФ: 141490 \ r \ n \ Result1: 22222222 (0x11111111) \ r \ nResult2: 07 \ r\ nResult3: 1250

Похоже, что значения для Result2 и / или Result3 выбраны правильноБольшую часть времени, но когда в последней строке есть другие значения, как показано выше (пример: 07 и 1250), это не соответствует ожидаемым результатам. Я предположил, что приведенное выше выражение re.search ищет результаты 1-3 по порядку, но оно просто ненадежно.

Может ли кто-нибудь пролить немного света на то, где я могу ошибаться с этим?

Спасибо.

1 Ответ

0 голосов
/ 24 октября 2019

Вы используете .* в своем паттерне, который жадный , поэтому он будет максимально совпадать, пропуская Result6 и 7, пока не найдет второе Result2:.

Вместо этого используйте .*?, это не жадная версия, которая подходит как можно меньше. См. re .

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