Python-串行读取和使用正则表达式对数据进行分组

问题描述 投票:1回答:1

我正在使用基本的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))

[执行代码并返回预期结果时串行数据的外观:

Result1:11111111(0x11111111)\ r \ nResult2:09 \ r \ nResult3:1000 \ r \ nResult4:1 \ r \ nResult5:20结果6:1 \ r \ n结果7:02 \ r \ n [即RF数据报:141490 \ r \ n \ Result1:11111111(0x11111111)\ r \ nResult2:09 \ r \ nResult3:1000

当代码执行并返回意外结果时,串行数据是什么样子:

Result1:11111111(0x11111111)\ r \ nResult2:09 \ r \ nResult3:1000 \ r \ nResult4:1 \ r \ nResult5:20结果6:1 \ r \ n结果7:02 \ r \ n [即RF数据报:141490 \ r \ n \结果1:22222222(0x11111111)\ r \ nResult2:07 \ r \ nResult3:1250

[看起来好像大多数时候都正确地拾取了Result2和/或Result3的值,但是当最后一行上有不同的值(如上所示)(例如:07和1250)时,它无法达到预期的效果结果。我以为上面显示的re.search表达式正在按顺序查找结果1-3,但这并不可靠。

有人可以告诉我我可能在哪里出错吗?

谢谢。

python regex python-3.x serial-port regular-language
1个回答
0
投票

您正在图案中使用.*,它是greedy,因此它将尽可能多地跳过Result6和7,直到找到第二个Result2:

改为使用.*?,它是尽可能少匹配的非贪婪版本。参见re

© www.soinside.com 2019 - 2024. All rights reserved.