不完全确定我是否说得对,但这就是我想要做的。
我有一个文件,我通常在GUI十六进制编辑器中打开,进行一些修改,然后保存并退出。我一直在寻找如何使用Python完全自动化这个过程。我似乎无法使我的正则表达式搜索模式正确,希望有人可以花点时间看看为什么不呢?
import binascii, re
infile = my_file.bin
with open(infile, "rb") as f:
data = binascii.b2a_hex(f.read()).upper()
for matches in list(data):
match_list = []
matches = re.findall(b'\x24' + b'\x([A-Z]).{3,10}', data)
match_list.append(matches)
我遇到的问题是尝试使用特殊序列代替十六进制字符,因为我手动搜索原始文件中有许多序列以进行修改。所有序列都以十六进制的'$'开头('\ x24'),但并非所有序列都具有相似的长度;他们都至少有3个跟随角色,我想确保我抓住所有这些解释{3,10}。
理想情况下,将这些找到的序列输出到列表中以供参考,然后创建一个包含找到的序列的字典,与找到的偏移量配对是最终目标。我已经广泛浏览了一页一页的文档试图找到一种可理解的方法来解决这个问题,我认为可以通过re.groupdict函数来实现,尽管我现在处于亏损状态。任何建议/帮助表示赞赏。
[编辑]刚刚找到一个类似的问题here,虽然我仍然觉得我的情况不同,因为我的正则表达式模式使用特殊序列而不是静态搜索。
您没有理由将任何内容转换为十六进制,Python re
模块可以轻松搜索原始字节字符串。但是你真的应该使用search
循环而不是使用findall
来获得找到字符串的偏移量。
代码可能变成:
import re
infile = "my_file.bin"
with open(infile, "rb") as f:
data = f.read()
matches = [] # initializes the list for the matches
curpos = 0 # current search position (starts at beginning)
pattern = re.compile(br'\$[A-Z]{3,10}') # the pattern to search
while True:
m = pattern.search(data[curpos:]) # search next occurence
if m is None: break # no more could be found: exit loop
matches.append(curpos + m.start(), m.group(0)) # append a pair (pos, string) to matches
curpos += m.end() # next search will start after the end of found string