2017-06-20 116 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'