python - 如何将包含字节字符串的字符串转换为字节字符串
问题描述
如何将包含字节字符串的文字表示的字符串转换为字节字符串?
这可能看起来很奇怪,但是对于我用于某种类型异常的库,我需要异常的属性之一,这给了我需要的值,但它是字符串中的字节字符串。
是的"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'
推荐阅读
- android - 为什么Android Studio ScrollView,有资源编译失败
- reactjs - 将文件从 Django FileField 上传到 Nex.js 公用文件夹
- html - Adding a table.tsv to HTML document
- python - 如何在 django 中使用外键来设置项目集?
- php - How to put the answer from recursive function in an array (PHP)?
- google-api - Converting a google calendar API in google colab
- swagger - Swagger: Changing property values based on status within a response example?
- reactjs - what are the command to send my local react app files to Github repository in VsCode?
- reactjs - 如何从嵌套集合中的数组中删除一条数据?
- c# - Getting Inconsistent Accessibility error on public interface