[英]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.