我不完全确定我是否正确地说过这一点,但这是我正在尝试做的事情。
我有一个文件,我通常在GUI十六进制编辑器中打开,进行一些修改,然后保存并退出。我一直在寻找如何使用Python完全自动化这个过程。我似乎无法使我的正则表达式搜索模式正确,希望有人可以花点时间看看为什么不呢?
com.toptoche.searchablespinner:searchablespinnerlibrary:1.3.1
我遇到的问题是尝试使用特殊序列代替十六进制字符,因为我手动搜索原始文件中有许多序列以进行修改。所有序列都以' $'开头。十六进制(' \ x24'),但并非所有序列都有相似的长度;他们都至少有3个跟随角色,我想确保我抓住所有这些解释{3,10}。
理想情况下,将这些找到的序列输出到列表中以供参考,然后创建一个包含找到的序列的字典,与找到的偏移量配对是最终目标。我已经广泛地浏览了一页又一页的文档,试图找到一种可理解的方法来解决这个问题,我认为可以通过re.groupdict函数来实现,尽管我现在处于亏损状态。任何建议/帮助表示赞赏。
[编辑] 刚发现了一个类似的问题here,但我仍然认为我的情况不同,因为我的正则表达式使用特殊序列而不是静态搜索。
答案 0 :(得分:0)
您没有理由将任何内容转换为十六进制,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