在大字符串中执行增量正则表达式搜索(Python)

时间:2013-11-28 03:50:11

标签: python regex python-2.x

使用Python 2.6.6。

我希望re模块提供一些模仿str.find()工作方式的搜索方法,允许你指定一个起始索引,但显然不是......

  • search()让我找到第一场比赛......
  • findall()将返回单个模式的所有(非重叠!)匹配
  • finditer()findall()类似,但通过迭代器(效率更高)

情况就是这样......我是在庞大的数据块中进行数据挖掘。对于部分解析,正则表达式很有效。但是一旦找到某些匹配项,我就需要切换到不同的模式,甚至使用更专业的解析来查找下一步开始搜索的位置。如果re.search允许我指定起始索引,那将是完美的。但如果没有,我正在看:

  1. 使用finditer(),但向前跳过,直到我使用re到达我想要恢复的索引。潜在问题:
    • 如果嵌入的二进制数据恰好包含与二进制块之后的合法匹配重叠的匹配...
    • 由于我不是在搜索单个模式,所以我必须处理多个迭代器,这也可能会隐藏真实的迭代器。
  2. 切片,即每次我想再次搜索时创建剩余数据的副本。
    • 这将是强大的,但会强制许多“不必要”复制可能是数兆字节的数据。
    • 我更喜欢保留它,以便所有匹配位置都是单个原始字符串对象的索引,因为我可能会挂起它们一段时间并想要比较它们。在单独的切片副本中查找后续匹配是簿记麻烦。
  3. 我刚刚想到我可以使用“旋转缓冲”的方法,但还没有完全考虑过。这可能会给代码带来很多复杂性。
  4. 我错过了任何明显的选择吗?不确定是否有办法用一个可以提供切片的类来包装一个巨大的字符串...或者是一个切片式的迭代器或“字符串游标”成语?

1 个答案:

答案 0 :(得分:4)

使用两遍法。第一遍使用第一个正则表达式来查找“有趣位”并将这些偏移输出到单独的文件中。你没有说你是否能分辨出每个有趣片段的“结束”在哪里,但如果可以的话,你也会包含它。第二遍使用偏移量将文件的各个部分作为独立字符串加载,然后在每个较小的字符串上应用您喜欢的任何辅助正则表达式。