【问题标题】:Python - serial read and use of regular expressions to group dataPython - 串行读取和使用正则表达式对数据进行分组
【发布时间】:2020-02-20 16:32:27
【问题描述】:

我正在使用基本的 Python 代码从串行线路读取数据。我将该数据存储到一个局部变量中,然后使用re.search 查找特定值。然后我使用match.group 对数据进行分组,这在大多数情况下效果很好。

我的问题是,有时我从串行数据中的另一个位置获取数据,根据我正在寻找的模式,这是不正确的。有什么办法可以让这个更可靠吗?

python函数的一些sn-ps:

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[那是RF 数据报:141490\r\n\Result1:11111111(0x11111111) \r\n结果2:09\r\n结果3: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[那是RF 数据报:141490\r\n\Result1:22222222(0x11111111) \r\n结果2:07\r\n结果3:1250

看起来Result2 和/或Result3 的值在大多数情况下都被正确提取,但是当最后一行有不同的值时(例如:07 和 1250),它会失败预期成绩。我假设上面显示的re.search 表达式正在按顺序查找结果 1-3,但这并不可靠。

谁能稍微说明一下我在这个问题上可能出了什么问题?

谢谢。

【问题讨论】:

  • \r\ns 最有可能是 CRLF 结尾,因此,您应该在模式中将 \\r\\n 替换为 \r\n

标签: python regex python-3.x serial-port regular-language


【解决方案1】:

你在你的模式中使用.*,这是贪婪,所以它会尽可能地匹配跳过Result6和7,直到找到第二个Result2:

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

【讨论】:

  • 太好了。谢谢你的建议。脚本现在可以可靠地运行。几天前我确实查看了这些正则表达式操作,但没有选择一个作为可能解决我的问题的方法。再次感谢,我会将其标记为解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2011-07-01
  • 2015-08-09
相关资源
最近更新 更多