2017-06-20 115 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。问题主要是'str()'调用是将字节对象转换为字符串的一种非常错误的方式。 –

+0

@MartijnPieters:我只是想知道为什么OP有'b'\ r \ n * ...''而不是''b'\\ r \\ n * ...'“'那么呢?如果你确定至少有两个问题,那么是的,它可以重新打开。 –

+0

@WiktorStribiżew:'print()'调用掩盖了这个问题;实际上'print(bytesobject)'已经使用'str()',所以第一行中的'str()'完全是多余的。 'str(sess.before)'* does * return''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是匹配对象;你可能想要拨打.group(1)那个:

>>> 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'