Python 重新搜索与字节字符串不匹配

Python 重新搜索与字节字符串不匹配,python,regex,python-3.x,pexpect,Python,Regex,Python 3.x,Pexpect,我从pexpect的session.before获取了一个string对象 由此,我尝试使用下面的正则表达式重新搜索获取设备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

我从pexpect的session.before获取了一个string对象

由此,我尝试使用下面的正则表达式重新搜索获取设备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
str调用将字节对象转换为表示形式。制表符将表示为字符序列“\”和“t”,而不是实际制表符:

>>> str(b'\t')
"b'\\t'"
别把你的bytestring锤成那样的绳子。将字节解码为字符串,或仅使用字节正则表达式:

device_id = re.search(b'([0-9a-zA-Z]+)[\t ]+device', sess.before)
现在设备id是匹配对象;您可能想打电话给.group1:


@维克托:有点像。问题主要在于str调用是将字节对象转换为字符串的一种非常错误的方式。@MartijnPieters:我只是想知道为什么OP有b'\r\n*..而不是b'\\r\\n*?如果您确定至少有2个问题,则可以重新打开该问题。@WiktorStribiżew:print调用屏蔽该问题;实际上,printbytesobject已经在使用str,因此第一行中的str是完全冗余的。stress.before确实返回b'\\r\\n*..,但当您打印…@MartijnPieters时,我理解这一点,但这仍然意味着如果str对bytes对象应用两次,OP应该写入b'\\r\\n*。Ashwin,如果您只是需要在正则表达式中添加b前缀来解决此问题,或者您还需要修改将输入传递给正则表达式的方式,请告知。@WiktorStribiżew:str应用于str时不使用repr,它只返回未更改的字符串。不要在这里掉入反向报告的陷阱。
>>> 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'