如何在字符串中替换十六进制值

时间:2019-03-27 13:22:41

标签: python-3.x string encoding utf-8 hex

从平面文件导入数据时,我注意到字符串(<0x00><0x01>)中有一些嵌入的十六进制值。

我想用特定字符替换它们,但无法这样做。删除它们也不起作用。 导出的平面文件中的外观:https://i.imgur.com/7MQpoMH.png 另一个示例:https://i.imgur.com/3ZUSGIr.png


这是我尝试过的: (请注意,<0x01>表示不可编辑的实体。在此无法识别。)

import io
with io.open('1.txt', 'r+', encoding="utf-8") as p:
    s=p.read()
# included in case it bears any significance
import re
import binascii

s = "Some string with hex: <0x01>"

s = s.encode('latin1').decode('utf-8')
# throws e.g.: >>> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 114: invalid start byte

s = re.sub(r'<0x01>', r'.', s)
s = re.sub(r'\\0x01', r'.', s)
s = re.sub(r'\\\\0x01', r'.', s)
s = s.replace('\0x01', '.')
s = s.replace('<0x01>', '.')
s = s.replace('0x01', '.')

或类似的东西,希望在遍历整个字符串的同时掌握它:

for x in s:
    try:
        base64.encodebytes(x)
        base64.decodebytes(x)
        s.strip(binascii.unhexlify(x))
        s.decode('utf-8')
        s.encode('latin1').decode('utf-8')
    except:
        pass

似乎什么也做不完。

我希望这些字符可以用我挖出的方法代替,但事实并非如此。我想念什么? 注意:我必须保留变音符(äöüÄÖÜ)

-编辑:

导出时是否可以首先引入十六进制值?如果是这样,有办法避免这种情况吗?

with io.open('out.txt', 'w', encoding="utf-8") as temp:
    temp.write(s)

1 个答案:

答案 0 :(得分:0)

从图像来看,这些实际上是控制字符。 您的编辑器以灰色显示方式显示它们,并使用十六进制表示法显示字节的值。 您的数据中没有字符“ 0x01”,但实际上只有一个字节,其值为1,因此unhexlify和朋友将无济于事。

在Python中,可以使用带有两个十六进制数字的符号\xHH的带有转义序列的字符串文字来生成这些字符。 第一张图片的片段可能等于以下字符串:

"sich z\x01 B. irgendeine"

您删除它们的尝试已结束。 s = s.replace('\x01', '.')应该可以。