【问题标题】:Convert mixed input to hex将混合输入转换为十六进制
【发布时间】:2019-01-13 15:52:00
【问题描述】:

所以我的输入是 hex 和 ascii 数据的混合。例如input=|3E 00|redcar|0D|. 这里管道内的数据(| |)是十六进制的。我想将不在管道中的所有内容转换为十六进制,以便获得完全十六进制的输出。

如果输入是|3E 00|redcar|0D|,我想要output= 3E007265646361720D。这是我到目前为止所做的:

import re

inputt = |3E 00|redcar|0D|
hexx = re.findall('\|(.*?)\|', inputt)
output= ' '.join(hexx).replace(" ", "")
print output #3E000D

如何访问不在管道中的部分,将其转换为十六进制(简单部分),然后将所有内容按正确顺序放回原处?谢谢

编辑: 我应该补充一点,十六进制在输入的 ascii 之前和之后并不是必须的。也可以是input=redcar|0D|input=|3E 00|redcar。所以解决方案需要通用。

【问题讨论】:

    标签: python regex hex


    【解决方案1】:

    不用正则也很容易解决:

    s='|3E 00|redcar|0D|'
    rslt=[]
    pipe=0
    for ch in s:
        if ch=='|':
            pipe+=1
            continue
        if pipe%2:
            if ch==" ":
                continue
            rslt.append(ch)
        else:
            rslt.append(f"{ord(ch):02X}")
    
    print("".join(rslt))
    '3E007265646361720D'
    

    【讨论】:

      【解决方案2】:

      试试这个模式:(\|[^\|]+\||^)(\w+?)(\|[^\|]+\||$)

      每场比赛将有三个捕获组:

      • 首先,(\|[^\|]+\||^) 将在开头为十六进制或 zer 宽度匹配(如果没有),

      • 秒将是 ASCII 字符串:(\w+?),您甚至可以使用 . 代替 \w

      • 第三个(\|[^\|]+\||$),如果有的话,最后将是十六进制。

      Demo

      【讨论】:

        【解决方案3】:

        您可以将re.sub 与可调用对象一起使用:

        import re
        s = '|3E|redcar|0D|'
        print(re.sub(r'(\|[^|]*?\|)|([^|]*)', lambda t: t.group(1) or ''.join(format(ord(c), 'x') for c in t.group(2)), s))
        

        这个输出:

        |3E|726564636172|0D|
        

        【讨论】:

        • 嗨。这给了我一个 TypeError。有语法问题吗?
        • 如果您使用的是 3.6 之前的 Python 版本,则必须使用 t.group(1) 而不是 t[1]。我已经更新了我的答案以与早期版本兼容。
        【解决方案4】:

        您可以使用捕获组。 See here.

        我不确定你的管道有多一致,所以你可能需要稍微编辑一下,但这里是模式。 \|(.+)\|(.*)\|(.+)\|

        第 1 组是前缀,第 2 组是需要转换为十六进制的部分,第 3 组是后缀。

        【讨论】:

          猜你喜欢
          • 2014-03-19
          • 1970-01-01
          • 2015-02-20
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多