2

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

AT\r\rOK\r\n

如果出现错误,它看起来像

AT\r\rERROR\r\n

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

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

  • 我想验证字符串中的原始命令,即ATX\r\rOK\r\n当命令只是AT.
  • 我根本不在乎有多少空白字符,我唯一期望的是\n最后有一个。所以AT\rOK\nandAT\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+的内容呢?

4

2 回答 2

1

您将()要提取的部分放在周围,因此您的正则表达式读取r"(?<!\S)AT\s+(\w+)\s*\n. 然后,您可以将一组与比赛放在一起,您可以提取例如group

r.search("yourText").group(1)
于 2012-10-05T15:15:23.880 回答
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')
于 2012-10-05T15:46:39.157 回答