正则表达式需要141k的步骤-有什么改进的方法吗?

时间:2018-11-14 15:07:45

标签: python regex

问题

我刚刚在regex101编辑器中构建了此表达式,以从已转换为txt的表单中提取数字。您可以在这里查看正则表达式和样本数据:https://regex101.com/r/P1458h/1/

^
(\d{1,3})\s+
(?:(?![\d,.]+\n).)+
([\d.,]+)\n

问题:步数超过141k,效率很低。知道我该如何改善吗?

说明

数据源是从PDF中提取的多行txt,导致输出效果不尽人意。

我正在尝试提取框号以及特定行中存在(填写)的任何数字。如果您查看上面的链接,则可以看到完整的示例。 例如

下面是Regex101的屏幕截图,显示了正面匹配。最上面一行匹配显示框号(155)和框号(34243)。

enter image description here

限制/要知道:

  • 我需要在python中使用它-必要时可以使用新的regex模块。
  • 该数字可能并不总是带有逗号(,),并且总是在换行符(\ n)之前。
  • 仅当输入数字/值时才匹配(例如,上例中的34243)。因此,在该示例中,与框号为170的行不匹配。
  • 格式更改会降低表格的格式,很乐意忽略

任何帮助将不胜感激!谢谢。

3 个答案:

答案 0 :(得分:4)

优化您的正则表达式后,我想到了这一点:

^
(\d{1,3})
\b
.+?
\b
([\d.,]+)
\n

Updated Regex Demo 执行20438个步骤来进行相同的匹配次数

如果输入的行尾不同,也可以用\n替换最后一个$

答案 1 :(得分:0)

通过将中间部分更改为简单的.+?,我得到了相同的匹配项。无需进行负面的前瞻。相反,您可以使用.+并添加?来制作+ non-greedy,这样它就不会消耗最终数字中的数字。

我还建议使用$来匹配行尾。

^
(\d{1,3})
.+?
([\d.,]+)
$

Demo: 18 matches, 73263 steps

答案 2 :(得分:0)

对接受版本的抗椭圆性有所改善

^(\d{1,3})\s.+?\b(\d[\d.,]*)$

20178步

PS上一页

^(\d{1,3})\s.+?\b(\d+,?\d+\.?\d+)\n

https://regex101.com/r/BahUUo/3/

20750步 18个比赛

将失败,并显示少量

PS。 (在scriptmonster评论之后更新)