我正在使用基本的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,但这并不可靠。
有人可以告诉我我可能在哪里出错吗?
谢谢。
您正在图案中使用.*
,它是greedy,因此它将尽可能多地跳过Result6
和7,直到找到第二个Result2:
。
改为使用.*?
,它是尽可能少匹配的非贪婪版本。参见re。