python正则表达式,从列表输出中提取字节

时间:2016-02-02 09:18:04

标签: python regex

我试图从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)

但是这个正则表达式匹配一切,有人知道如何以一种简单的方式做到这一点? 谢谢 大卫

4 个答案:

答案 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"';} ?>