2

コマンドをモデムに送信する場合、通常はコマンド (例: AT) の後に\r. 次に、モデムをリッスンして、このコマンド自体が繰り返されるコマンドの結果を確認します。したがって、モデムからの典型的な通信フィードバックは次のようになります。

AT\r\rOK\r\n

エラーの場合は次のようになります

AT\r\rERROR\r\n

ただし、一般に、実際の AT コマンドによっては、返される値は と 以外の値になる可能性がOKありERRORます。

OKこの応答、つまり、 、ERRORまたはモデムが応答するものを返す正規表現を抽出したいと思います。条件は次のとおりです。

  • 文字列内の元のコマンドを確認したい。つまりATX\r\rOK\r\n、コマンドがちょうどAT.
  • 空白文字がいくつあるかはまったく気にしません。私が期待するのは\n、最後に a があることだけです。したがってAT\rOK\n、 とAT\nOK\r\r\nも一致するはずですが、 ではありませんAT\nOK\r\r
  • 最後に、AT コマンドと空白文字で区切られている限り、左側の余分なものは気にしません。したがってOK\rAT\rOK\n 、一致する必要があります (つまり、 の右側のオカレンスOK) が、XAT\rOK\r\n一致する必要はありません。

モデムの応答を抽出するために 1 つの正規表現でこれを行うことは可能ですか、それとも複数の正規表現検索を行う必要がありますか? 全体が正しく一致するかどうかを確認するために、次の式をすでに見つけている可能性があります。

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

\w+しかし、 の構成要素を抽出するにはどうすればよいでしょうか。

4

2 に答える 2

1

()抽出したい部分を囲むので、正規表現はr"(?<!\S)AT\s+(\w+)\s*\n. 次に、一致するグループを 1 つ取得し、次のようにして抽出できますgroup

r.search("yourText").group(1)
于 2012-10-05T15:15:23.880 に答える
0

否定の後読みを使用して、スペース以外の文字が前にある一致を抑制し、括弧を使用して応答を取得します: 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 に答える