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

时间:2018-02-15 07:25:54

标签: regex python-2.7 regex-negation regex-group

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

  1. 起始分隔符将是"传入消息"或"传出消息"
  2. 在开始分隔符之后,会有可能包含我的关键字的文本。如果文本包含关键字,那么我将提取消息
  3. 我假设结尾的分隔符是相同的,即"传入的消息"或"传出消息"
  4. 我做了以下正则表达式: ((?:(?!((\sincoming|outgoing)\smessage)).)*keyword.*?)((incoming|outgoing)\smessage) 正则表达式对我来说非常适合用于1000页PDF格式的小文档,但它可以说是13000页的文档(在这种情况下代码运行超过12小时)。 我只从正则表达式结果中提取组(1)。我怀疑我所做的大量团队正在使它减速并迭代地运行匹配。但是,如果有人能够指导如何构建这样的正则表达式以及任何有效的替代方案,这将产生一个合适的时间框架,我将不胜感激。我在我的脚本中使用python 2.7。

    示例文本可以是:

    传入消息 传入消息 传入消息 关键词 abctext 关键词 传入消息 传入消息 gsgsfvhvhgh gfvgvhhhjjbn 765568856866

    传入消息 传出消息 传入消息 91981966802866 关键词 其他文字 Dhai 20-12-2017 15:29:47 文本 传入消息

    输出应为:

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

1 个答案:

答案 0 :(得分:1)

以下(组0匹配):

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

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

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

从精确匹配开始而不是负向前瞻会减少回溯。