我试图从visual studio中通过/ Fa标志生成的列表文件中提取二进制操作码。格式如下:
00040 8b 45 bc mov eax, DWORD PTR _i$2535[ebp]
00043 3b 45 c8 cmp eax, DWORD PTR _code_section_size$[ebp]
00046 73 19 jae SHORT $LN1@unpacker_m
当第一个数字是地址时,我们有操作码,然后是指令助记符,在这种情况下,我想得到一个数组:
8b 45 bc 3b 45 c8 73 19
首先,我拆分该行,然后运行以下正则表达式来获取字节:
HEX_BYTE = re.compile("\s*[\da-fA-F]{2}\s*", re.IGNORECASE)
但是这个正则表达式匹配一切,有人知道如何以一种简单的方式做到这一点? 谢谢 大卫
答案 0 :(得分:3)
忘记正则表达式,从固定字段中提取数据过于复杂。陈述
line = ' 00043 3b 45 c8 cmp eax,'
print(line[7:19].split())
产量
['3b', '45', 'c8']
您可能需要
line = line.expandtabs()
首先是输入字符串中有 Tab 字符。
答案 1 :(得分:0)
你可以尝试这个:\s[\da-fA-F]{2}\s[\da-fA-F]{2}(\s[\da-fA-F]{2})?
它将为您的示例返回三个结果:
“8b 45 bc”
“3b 45 c8”
“73 19”
你必须用空格分割它们,然后你得到与你描述的相同的结果。
答案 2 :(得分:0)
查看问题中的文件示例,它似乎包含固定宽度字段,因此您应该能够使用固定偏移量将这些值提取到每一行:
with open('listing.txt') as listing:
opcodes = [opcode for line in listing for opcode in line[8:16].split()]
>>> opcodes
['8b', '45', 'bc', '3b', '45', 'c8', '73', '19']
上面使用列表推导来除去切片操作和split()
之外的所有字段,这些字段已知存在于位置8到16中。这应该比正则表达式快得多,并且 更具可读性。
如果您希望操作码为整数:
with open('listing.txt') as listing:
opcodes = [int(opcode, 16) for line in listing for opcode in line[8:16].split()]
>>> opcodes
[139, 69, 188, 59, 69, 200, 115, 25]
答案 3 :(得分:0)
借助正则表达式的Python示例:
<?php if (($_POST['active']) == 'active') {echo 'checked="checked"';} ?>