【问题标题】:Optimising regex for matching text in python优化正则表达式以匹配python中的文本
【发布时间】:2018-02-15 07:25:53
【问题描述】:

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

  1. 起始分隔符将是“传入消息”或“传出消息”
  2. 在开始分隔符之后,会有可能包含我的关键字的文本。如果文本包含关键字,那么我会提取消息
  3. 我假设结束分隔符相同,即“传入消息”或“传出消息”

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

示例文本可以是:

收到的消息 传入消息 传入消息 关键词 正文 关键词 传入消息 传入消息 gsgsfvhvhgh gfvgvhhhjjbn 765568856866

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

输出应该是:

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

【问题讨论】:

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


【解决方案1】:

以下(第 0 组比赛):

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

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

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

从完全匹配开始而不是负前瞻减少了回溯。

【讨论】:

  • 感谢您的努力!猜猜这会优化结果。 @Wiktor:非常感谢您的帮助。
猜你喜欢
  • 2017-03-17
  • 2018-07-17
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多