re.search与字节字符串不匹配
问题描述:
我有一个从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
答
的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'
@Wiktor:kinda-sorta。问题主要是'str()'调用是将字节对象转换为字符串的一种非常错误的方式。 –
@MartijnPieters:我只是想知道为什么OP有'b'\ r \ n * ...''而不是''b'\\ r \\ n * ...'“'那么呢?如果你确定至少有两个问题,那么是的,它可以重新打开。 –
@WiktorStribiżew:'print()'调用掩盖了这个问题;实际上'print(bytesobject)'已经使用'str()',所以第一行中的'str()'完全是多余的。 'str(sess.before)'* does * return''b'\\ r \\ n * ...'“',但是当你然后*打印*那...... –