因此,我的输入是十六进制和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|redcar
或employee = Employee.query.filter_by(email=request.form['email']).first()
session['employee_id'] = employee.get_or_404(id)
。因此,解决方案必须是通用的。
答案 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
,
第三个(\|[^\|]+\||$)
,如果有的话将以十六进制结尾。
答案 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'