如何将包含字节串的字符串转换为字节串

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'