优化正则表达式以匹配 python 中的文本

Optimising regex for matching text in python

我正在学习正则表达式并遇到一个用例,其中有一个非常大的 pdf,我的目标是根据以下内容从 pdf 中过滤掉内容:

  1. 起始分隔符将为 "incoming message" 或 "outgoing message"
  2. 后面是起始分隔符,可能是包含我的关键字的文本。如果文本包含关键字,那么我将提取消息
  3. 我假设结束分隔符相同,即 "incoming message" 或 "outgoing message"

我制作了以下正则表达式: ((?:(?!((\sincoming|outgoing)\smessage)).)*keyword.*?)((incoming|outgoing)\smessage) 正则表达式对我来说非常适合小文档,比如 1000 页的 pdf,但它会挂起 13000 页的文档(在这种情况下,代码 运行ning 超过 12 小时)。 我仅从正则表达式结果中提取 group(1)。我怀疑我制作的大量组导致它变慢并且 运行 迭代匹配。但是,如果有人可以指导如何构建这样的正则表达式和任何有效的替代方法,我将不胜感激,这些替代方法将在适当的时间范围内产生结果。我的脚本使用 python 2.7。

示例文本可以是:

收到的消息 传入消息 传入消息 关键词 abctext 关键词 传入消息 传入消息 高高在上 gfvgvhhhjbn 765568856866

收到的消息 传出信息 传入消息 91981966802866 关键词 其他文字 泰国菜 20-12-2017 15:29:47 文本 收到的消息

输出应该是:

  1. match1:传入消息关键字 abctext 关键字
  2. match2: 传入消息 91981966802866 关键词 其他文字 泰国菜 20-12-2017 15:29:47 文字

以下(第 0 组比赛):

(?:incoming|outgoing)\smessage(?:(?!(?:incoming|outgoing)\smessage).)*keyword.*?(?=(?:incoming|outgoing)\smessage)

显示 1868 步而原始显示 20020 步,而不是

((?:(?!((\sincoming|outgoing)\smessage)).)*keyword.*?)((incoming|outgoing)\smessage)

从精确匹配而不是否定前瞻开始减少回溯。