将混合输入转换为十六进制

时间:2018-08-06 16:17:07

标签: python regex hex

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

如果输入为output= 3E007265646361720D,我想要import re inputt = |3E 00|redcar|0D| hexx = re.findall('\|(.*?)\|', inputt) output= ' '.join(hexx).replace(" ", "") print output #3E000D 。这是我到目前为止所做的:

input=redcar|0D|

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

编辑: 我要补充一点,在输入ascii之前和之后,十六进制都不是必须的。也可以是input=|3E 00|redcaremployee = Employee.query.filter_by(email=request.form['email']).first() session['employee_id'] = employee.get_or_404(id) 。因此,解决方案必须是通用的。

4 个答案:

答案 0 :(得分:1)

您可以将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|

答案 1 :(得分:0)

您可以使用捕获组。 See here

我不确定管道的一致性如何,因此您可能需要对其进行一些编辑,但这是模式。 \|(.+)\|(.*)\|(.+)\|

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

答案 2 :(得分:0)

尝试以下模式:(\|[^\|]+\||^)(\w+?)(\|[^\|]+\||$)

每场比赛都会有三个捕获组:

  • 首先,(\|[^\|]+\||^)将以十六进制开头或zer-width匹配(如果没有),

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

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

Demo

答案 3 :(得分:0)

无需正则表达式即可轻松解决:

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'