首页 > 解决方案 > 如何将包含字节字符串的字符串转换为字节字符串

问题描述

如何将包含字节字符串的文字表示的字符串转换为字节字符串?

这可能看起来很奇怪,但是对于我用于某种类型异常的库,我需要异常的属性之一,这给了我需要的值,但它是字符串中的字节字符串。

是的"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

标签: pythonpython-3.xcharacter-encoding

解决方案


有一个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'

推荐阅读