Python3 re.findall在bytes对象中出现,使用特定字节对象+正则表达式作为搜索参数的串联

时间:2018-05-16 06:40:26

标签: python regex python-3.x hex

我不完全确定我是否正确地说过这一点,但这是我正在尝试做的事情。

我有一个文件,我通常在GUI十六进制编辑器中打开,进行一些修改,然后保存并退出。我一直在寻找如何使用Python完全自动化这个过程。我似乎无法使我的正则表达式搜索模式正确,希望有人可以花点时间看看为什么不呢?

com.toptoche.searchablespinner:searchablespinnerlibrary:1.3.1

我遇到的问题是尝试使用特殊序列代替十六进制字符,因为我手动搜索原始文件中有许多序列以进行修改。所有序列都以' $'开头。十六进制(' \ x24'),但并非所有序列都有相似的长度;他们都至少有3个跟随角色,我想确保我抓住所有这些解释{3,10}。

理想情况下,将这些找到的序列输出到列表中以供参考,然后创建一个包含找到的序列的字典,与找到的偏移量配对是最终目标。我已经广泛地浏览了一页又一页的文档,试图找到一种可理解的方法来解决这个问题,我认为可以通过re.groupdict函数来实现,尽管我现在处于亏损状态。任何建议/帮助表示赞赏。

[编辑] 刚发现了一个类似的问题here,但我仍然认为我的情况不同,因为我的正则表达式使用特殊序列而不是静态搜索。

1 个答案:

答案 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