2017-06-20 11 views
-1

pexpectのsession.beforeから取得した文字列オブジェクトがあります。re.searchがバイト文字列と一致しません

これから私はre.searchの下の正規表現を使用してデバイスIDを取得しようとしています。しかし、それは一致していません。

print (str(sess.before)) 
b'\r\n* daemon not running. starting it now on port 5037 *\r\n* daemon started successfully *\r\n353651\tdevice\r\n\r\n\r\n' 

device_id = re.search ('([0-9a-zA-Z]+)[\t ]+device', str(sess.before)) 
print (device_id) 
None 
+0

@Wiktor:kinda-sortaに.group(1)と電話するとよいでしょう。この問題は 'str()'呼び出しが 'bytes'オブジェクトを文字列に変換する非常に間違った方法であることが主な原因でした。 –

+0

@MartijnPieters:私はなぜOPに「b '\ r \ n * ...' 'ではなく、「b」\\ r \\ n *少なくとも2つの問題があると確信できたら、はい、再開できます。 –

+0

@WiktorStribiżew: 'print()'呼び出しは問題をマスクします。 'print(bytesobject)'は既に 'str()'を使っていますので、最初の行の 'str()'は完全に冗長です。 'str(sess.before)' *は '' b '\\ r \\ n * ...' ''を返しますが、それを*印刷*すると... –

答えて

3

str()コールは表現にごbytesオブジェクトに変換します。タブは、文字列'\''t'、実際のタブとして表現されます。

>>> str(b'\t') 
"b'\\t'" 

そのような文字列にあなたのバイト文字列をハンマーしないでください。ただどちらか文字列にバイトからデコード、またはbytes正規表現を使用します。

device_id = re.search(b'([0-9a-zA-Z]+)[\t ]+device', sess.before) 

を今device_idがマッチオブジェクトです。

>>> import re 
>>> before = b'\r\n* daemon not running. starting it now on port 5037 *\r\n* daemon started successfully *\r\n353651\tdevice\r\n\r\n\r\n' 
>>> re.search(b'([0-9a-zA-Z]+)[\t ]+device', before) 
<_sre.SRE_Match object; span=(89, 102), match=b'353651\tdevice'> 
>>> re.search(b'([0-9a-zA-Z]+)[\t ]+device', before).group(1) 
b'353651' 
関連する問題