我有一个字符串,其中包含十六进制字符的浮点值,如下所示:
"\\64\\2e\\9b\\38"
Run Code Online (Sandbox Code Playgroud)
我想提取浮点数,但为了做到这一点,我必须让Python看到字符串为4个十六进制字符,而不是16个常规字符.首先我尝试替换正斜杠,但是我收到了一个错误:
>>>> hexstring.replace("\\", "\x")
ValueError: invalid \x escape
Run Code Online (Sandbox Code Playgroud)
我发现了
struct.unpack("f", "\x64\x2e\x9b\x38")
Run Code Online (Sandbox Code Playgroud)
完全符合我的要求,但如何转换字符串呢?
每当我看到一个(格式错误的)字符串,例如由这个字符列表组成的字符串:
['\\', '\\', '6', '4', '\\', '\\', '2', 'e', '\\', '\\', '9', 'b', '\\', '\\', '3', '8']
Run Code Online (Sandbox Code Playgroud)
什么意图是这个字符列表
['\x64', '\x2e', '\x9b', '\x38']
Run Code Online (Sandbox Code Playgroud)
我找到了decode('string_escape')方法.
但要使用它,我们需要用两个字符r'\\'替换r'\x'.您可以使用该replace(...)方法.
In [37]: hexstring=r'\\64\\2e\\9b\\38'
In [38]: struct.unpack('f',(hexstring.replace(r'\\',r'\x').decode('string_escape')))
Out[38]: (7.3996168794110417e-05,)
In [39]: struct.unpack("f", "\x64\x2e\x9b\x38")
Out[39]: (7.3996168794110417e-05,)
Run Code Online (Sandbox Code Playgroud)
PS.这种decode方法的使用在Python2中有效,但在Python3中不起作用.在Python3 codecs.decode中,严格意味着将字节对象转换为字符串对象(错误,Python2调用unicode对象),而在上面的示例中,decode实际上是将字符串对象转换为字符串对象.Python2中的大多数解码编解码器确实将字符串对象转换为unicode对象,但有些'string_escape'不喜欢.通常,它们已被移动到其他模块,或以其他方式调用.
在Python3,相当于hexstring.decode('string_encode')是codecs.escape_decode(hexstring)[0].
编辑:另一种方式,与jsbueno的答案相似,是使用binascii.unhexlify:
In [76]: import binascii
In [81]: hexstring=r"\\64\\2e\\9b\\38"
In [82]: hexstring.replace('\\','')
Out[82]: '642e9b38'
In [83]: binascii.unhexlify(hexstring.replace('\\',''))
Out[83]: 'd.\x9b8'
Run Code Online (Sandbox Code Playgroud)
这些timeit结果表明binascii.unhexlify最快:
In [84]: %timeit binascii.unhexlify(hexstring.replace('\\',''))
1000000 loops, best of 3: 1.42 us per loop
In [85]: %timeit hexstring.replace('\\','').decode('hex_codec')
100000 loops, best of 3: 2.94 us per loop
In [86]: %timeit hexstring.replace(r'\\',r'\x').decode('string_escape')
100000 loops, best of 3: 2.13 us per loop
Run Code Online (Sandbox Code Playgroud)
根据评论编辑:
这个答案包含原始字符串.公共卫生部建议,吃生的或未煮熟的串会对每个人造成健康风险,特别是老年人,4岁以下的幼儿,孕妇和其他免疫系统受损的高度易感个体.彻底煮熟生猪串可降低患病风险.