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