[英]How to convert a string containing a byte string to a byte string
如何將包含字節字符串的文字表示的字符串轉換為字節字符串?
這可能看起來很奇怪,但對於我用於某種類型異常的庫,我需要異常的屬性之一,這給了我需要的值,但它是字符串中的字節字符串。
它是"value=b'\\xbbOFa\\x14\\xdb{\\xf5\\x1b~H\\xba\\x96\\xdaec'"
,我可以通過等號拆分然后使用eval
,例如
>>> eval("value=b'\\xbbOFa\\x14\\xdb{\\xf5\\x1b~H\\xba\\x96\\xdaec'".split("=")[1])
b'\xbbOFa\x14\xdb{\xf5\x1b~H\xba\x96\xdaec'
這行得通,但我們都知道eval
可能非常非常糟糕。 那么,是否有使用eval
的替代方法?
有一個unicode-escape
編解碼器,它將包含像\x..
或\u....
.. 這樣的文字序列的字節轉換為字符串中的等效字符。 字符串的其余部分使用latin1
編碼進行轉換,該編碼僅轉換所有字節。
因此,您使用latin1
將字符串轉換為原始字節,然后使用unicode-escape
轉換回字符串,最后再次使用latin1
轉換回字節:
>>> s = '\\xbbOFa\\x14\\xdb{\\xf5\\x1b~H\\xba\\x96\\xdaec'
>>> s.encode('latin1').decode('unicode-escape').encode('latin1')
b'\xbbOFa\x14\xdb{\xf5\x1b~H\xba\x96\xdaec'
使用正則表達式或您展示的更多手動解析非常容易擺脫字符串周圍的混亂。 例如:
>>> x = "value=b'\\xbbOFa\\x14\\xdb{\\xf5\\x1b~H\\xba\\x96\\xdaec'"
>>> s = re.fullmatch('[^\'"]+b([\'"])(.*)\\1[^\'"]*', x).group(2)
>>> s
'\\xbbOFa\\x14\\xdb{\\xf5\\x1b~H\\xba\\x96\\xdaec'
或者
>>> s = x.split('=')[1].lstrip('b').strip("'")
>>> s
'\\xbbOFa\\x14\\xdb{\\xf5\\x1b~H\\xba\\x96\\xdaec'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.