簡體   English   中英

python正則表達式,從列表輸出中提取字節

[英]python regular expression, extract bytes from listing output

我正在嘗試從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)

但這個正則表達式匹配一切,有人知道如何以一種簡單的方式做到這一點? 謝謝大衛

忘記正則表達式,從固定字段中提取數據過於復雜。 聲明

line = '  00043 3b 45 c8     cmp     eax,'
print(line[7:19].split())

['3b', '45', 'c8']

你可能需要

line = line.expandtabs()

首先,如果輸入字符串中有Tab字符。

你可以嘗試這個: \\s[\\da-fA-F]{2}\\s[\\da-fA-F]{2}(\\s[\\da-fA-F]{2})?

它會為您的示例返回三個結果:

“公元前8b 45”

“3b 45 c8”

“73 19”

你必須用空格分割它們,然后你得到與你描述的相同的結果。

查看問題中的文件樣本,它似乎由固定寬度字段組成,因此您應該能夠使用固定偏移量將這些值提取到每一行:

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]

借助正則表達式的Python示例:

import re
string = """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"""

bytes = map(str.strip, re.findall(r'((?:\b[\da-fA-F]{2}\b\s+)+)', string))
print bytes
# ['8b 45 bc', '3b 45 c8', '73 19']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM