如何将包含字节串的字符串转换为字节串
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'
如何将包含字节字符串文字表示的字符串转换为字节字符串?
这可能看起来很奇怪,但是对于我用于某种类型异常的库,我需要异常的属性之一,这给了我需要的值,但它是一个字节字符串字符串.
是"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'