[英]How to use a regex to search for contiguous incrementing sequences
我想使用正则表达式来提高在大型二进制映像中对特定记录的搜索速度。 看起来正则表达式搜索总是比我自己的搜索方法要好,所以这就是为什么我要研究这个问题。 我已经实现了以下方法,该方法可以运行,但是速度不是很快。
我的二进制图像以单词的形式加载到Numpy memmap中。
I_FILE = np.memmap(opts.image_file, dtype='uint32', mode='r')
这是当前我的搜索循环的开始(有效):
for i in range(0, FILESIZE - 19):
if (((I_FILE[i] + 1 == I_FILE[i + 19]) or (I_FILE[i - 19] + 1 == I_FILE[i])) and I_FILE[i] < 60):
...do stuff...
这是在寻找19字节长的记录,这些记录以0到59之间的十进制序列号开头。它在当前搜索位置之前或之后的记录上寻找递增序列,以验证记录。
我看过一些例子,人们使用re.escape将变量制作为字符串(例如: 如何在正则表达式中使用变量? ),但是我似乎无法弄清楚如何搜索变化的值序列。
我设法使其与正则表达式一起使用,但是它比我预期的要复杂一些。 regex表达式查找0到59之间的两个值,这些值之间用72个字节(18个字)分隔。 我使用两次正则表达式搜索来确保在序列结束时不会丢失记录:
# First search uses the lookahead assertion to not consume large amounts of data.
SearchPattern1 = re.compile(b'[\0-\x3B]\0\0\0(?=.{72}[\1-\x3B]\0\0\0)', re.DOTALL)
# Again using the positive lookbehind assertion (?<= ... ) to grab the ending entries.
SearchPattern2 = re.compile(b'(?<=[\0-\x3B]\0\0\0.{72})[\1-\x3B]\0\0\0', re.DOTALL)
接下来,执行两个搜索并合并结果。
HitList1 = [m.start(0) for m in SearchPattern1.finditer(I_FILE)]
HitList2 = [m.start(0) for m in SearchPattern2.finditer(I_FILE)]
AllHitList = list(set(HitList1 + HitList2))
SortedHitList = sorted(AllHitList)
现在,我进行的搜索具有与原始解决方案相同的条件,但它只对更小的数据集运行!
for i in range(0, len(SortedHitList)):
TestLoc = SortedHitList[i]
if (I_FILE[TestLoc] + 1 == I_FILE[TestLoc + 19]) or (I_FILE[TestLoc - 19] + 1 == I_FILE[TestLoc]):
... do stuff ...
结果非常成功! 原始解决方案在300 MB的二进制文件上运行需要58秒,而新的regex解决方案仅需2秒!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.