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

Python - serial read and use of regular expressions to group data

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

代码执行时串口数据的样子和returns预期结果:

Result1:11111111(0x11111111)\r\nResult2:09\r\nResult3:1000\r\nResult4:1\r\nResult5:20 Result6:1\r\nResult7:02\r\n[Thats a RF Datagram:141490\r\n\Result1:11111111(0x11111111) \r\nResult2:09\r\nResult3:1000

代码执行时串口数据是什么样的以及returns意外结果:

Result1:11111111(0x11111111)\r\nResult2:09\r\nResult3:1000\r\nResult4:1\r\nResult5:20 Result6:1\r\nResult7:02\r\n[Thats a RF Datagram:141490\r\n\Result1:22222222(0x11111111) \r\nResult2:07\r\nResult3:1250

看起来 Result2 and/or Result3 的值大部分时间都被正确拾取,但是当最后一行有不同的值时,如上所示(示例: 07 和 1250),它没有达到预期的结果。我假设上面显示的 re.search 表达式正在按顺序查找结果 1-3,但它并不可靠。

谁能告诉我这个问题可能哪里出错了?

谢谢。

您在模式中使用了 .*,它是 greedy,因此它将尽可能匹配跳过 Result6 和 7 直到它找到第二个 Result2:.

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