正则表达式灾难性的回溯问题

时间:2018-02-28 18:24:41

标签: regex backtracking

我正在尝试扫描以下类型的文件。文件存在以串行方式交替的特定块,例如:

**Block A starts**
-some data- **Block B starts**
-some data- ***END***---- **Block A starts**
-some data- **Block B starts**
-some data- ***END***---- etc etc.

此文件可能非常大(例如500gb)。 我正在尝试使用正则表达式扫描文件以获取每个块的数据,例如:

  

[[块A数据,块B数据],[块A数据,块B数据]]

我在开始尝试这样做的方式是使用这个正则表达式:

"Block A starts(.+?)Block B starts(.+?)END"

如果文件采用这种格式,一切正常,但是如果例如Block B没有出现在日志文件中,则此正则表达式会出现问题。我想我有回溯问题。我读到你必须使用原子组去除回溯,所以我写了这个正则表达式:

"(?=(?P<group1>.+?Block B starts))(?P=group1)(?=(?P<group2>.+?END))(?P=group2)"

但仍有同样的问题。我也试过这个正则表达式,以便在它到达文件末尾时停止,但仍然没有成功。

"(?=(?P<group1>.+?(?:Block B starts|\Z)))(?P=group1)(?=(?P<group2>.+?(?:END|\Z)))(?P=group2)"

如果正则表达式与文件不匹配,则需要永久完成大文件。

任何人都知道如何修复正则表达式,以便正确匹配文件,但如果任何这些块不存在,也会使其快速失败。

(我正在使用带有默认re模块的python)

0 个答案:

没有答案