2017-03-23 14 views
1

ソケット接続を使用して別のアプリケーション(正確には埋め込みターゲットに接続されたデバッガ)と通信しているPythonスクリプトがあります。キャリッジリターンと改行文字を含む部分文字列の検索

デバッガからの応答は長さが異なり、複数の行にまたがる可能性がありますが、常に末尾がTrue\r\nまたはFalse\r\nのいずれかで終了します。改行文字を含めてTrueまたはFalseをキャプチャします。

私が使用している正規表現(r'^[.]+|[\r]+|[\n]+(True\r\n)$'がTrueの場合)は、regex101.comでテストしたときに機能するようですが、Pythonで実行すると\rしか返されません。サンプル応答文字列と

サンプルコード:

import re 
sample_response = 'var0 = 0x00000001\r\nTrue\r\n' 
re_true = re.compile(r'^[.]+|[\r]+|[\n]+(True\r\n)$') 
print re_true.search(sample_response).group(0) # Will print out '\r' 

私は私が使用している正規表現とは根本的に間違って何かが存在しているはず。以下に示すように、私も肯定後読みを試してみた、それが動作するようですが、これはこれを行うには正しいの方法である場合、私はわからない:

import re 
sample_response = 'var0 = 0x00000001\r\nTrue\r\n' 
re_true = re.compile(r'(?<=(True\r\n))') 
print re_true.search(sample_response).group(0) # Will print out '' 
print re_true.search(sample_response).group(1) # Will print out 'True\r\n' 
+0

はい、regex101には '\ r'がありません。改行スタイルは' \ n'です。あなたの正規表現は 'True '部分を試す前にあなたの入力に' \ r'をマッチさせ、NFA正規表現で勝つ最初の選択肢です。 're.findall'を試してみるか、要件を再考してください。 –

+0

うん、私は正規表現をテストするために正規表現をテストするためにregex101.comに\ nを使用しています...それに関係なく、regex101リファレンスはおそらくTMIであり、本当に私の質問ではありません:) – schaazzz

+0

findallでテストします...ありがとう! – schaazzz

答えて

1

あなたはTrue\r\nFalse\r\nと一致する必要が言います、あなたのパターンの^[.]+|[\r]+|は冗長です。

re.search(r'[\r\n]*\b(?:True|False)[\r\n]*$', s) 

を使用するか、またはTrueFalse前には、改行を必要としない場合は初期[\r\n]*を除外。

詳細

  • [\r\n]* - ゼロ以上のCRまたはLFシンボル
  • \b
  • - ワード境界
  • (?:True|False) - いずれかの単語全体
  • [\r\n]*としてTrue又はFalse - 上記のように
  • $ -e文字列のnd。
関連する問題