Python Regex从调制解调器AT命令中提取响应

时间:2012-10-05 15:08:44

标签: python regex

向调制解调器发送命令时,通常会发送命令(例如AT),然后发送\r。然后,监听调制解调器以查看命令的结果,其中该命令本身被重复。因此来自调制解调器的典型通信反馈看起来像

AT\r\rOK\r\n

如果出现错误,则显示为

AT\r\rERROR\r\n

但一般来说,根据实际的AT命令,返回的值可以是除OKERROR之外的任何值。

我想提取这个响应,即一个正则表达式,它返回OKERROR或调制解调器回复的任何内容。以下是条件:

  • 我想验证字符串中的原始命令,即当命令只是ATX\r\rOK\r\n时,AT不匹配。
  • 我根本不关心有多少个空白字符,我唯一期望的是最后有一个\n。因此AT\rOK\nAT\nOK\r\r\n也应该匹配,但不是AT\nOK\r\r
  • 最后,我不关心左侧的额外内容,只要它们通过空格字符与AT命令分开。因此OK\rAT\rOK\n应匹配(即OK的右侧出现),但XAT\rOK\r\n不匹配。

是否可以使用一个正则表达式来提取调制解调器响应,还是需要进行多个正则表达式搜索?要查看整个事物是否完全匹配,我可能已经找到了一个表达式:

r = re.compile("\s+AT\s+\w+\s*\\n$")

但是如何提取\w+包含的内容?

2 个答案:

答案 0 :(得分:1)

您将()放在要提取的部分周围,因此正则表达式会显示r"(?<!\S)AT\s+(\w+)\s*\n。然后,您可以将一个组与匹配组合在一起,您可以提取例如与group

r.search("yourText").group(1)

答案 1 :(得分:0)

使用负向lookbehind来抑制前面有非空格字符的匹配,使用括号来捕获响应:r"(?<!\S)AT\s+(\w+)\s*\n$"\S表示任何非空格字符)。然后,如果group(1)的结果不是re.search,您可以使用None提取回复。

>>> p = re.compile(r"(?<!\S)AT\s+(\w+)\s*\n$")
>>> p.search('ATX\r\rOK\r\n')
>>> p.search('AT\rOK\n')
<_sre.SRE_Match object at 0x10049df30>
>>> _.group(1)
'OK'
>>> p.search('AT\nOK\r\r\n')
<_sre.SRE_Match object at 0x10049df30>
>>> p.search('AT\nOK\r\r')
>>> p.search('OK\rAT\rOK\n')
<_sre.SRE_Match object at 0x1004a4198>
>>> p.search('XAT\rOK\n')