Python Regex采取了141k个步骤-有什么改进的方法吗? 问题

Python Regex采取了141k个步骤-有什么改进的方法吗? 问题,python,regex,Python,Regex,我刚刚在regex101编辑器中构建了这个表达式,用于从已转换为txt的表单中提取图形。您可以在此处查看正则表达式和示例数据: 问题:使用141k+个步骤似乎效率很低。有什么办法可以改进吗? 解释 数据源是从PDF中提取的多行txt,导致输出不够完美 我正在尝试提取框号以及特定行中存在(填写)的任何数字。如果你检查上面的链接,你可以看到完整的样本。例如: 下面是显示积极匹配的屏幕截图。最上面的一行匹配显示方框编号(155)和编号(34243) 限制/好消息: 我需要它在python中工作——

我刚刚在regex101编辑器中构建了这个表达式,用于从已转换为txt的表单中提取图形。您可以在此处查看正则表达式和示例数据:

问题:使用141k+个步骤似乎效率很低。有什么办法可以改进吗?

解释 数据源是从PDF中提取的多行txt,导致输出不够完美

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

下面是显示积极匹配的屏幕截图。最上面的一行匹配显示方框编号(155)和编号(34243)

限制/好消息:

  • 我需要它在python中工作——如果需要,可以使用新的正则表达式模块
  • 数字不一定总是有逗号(,),而且总是在换行符(\n)的结尾之前
  • 仅当填写了数字/值时匹配(例如,上述示例中的34243)。所以在这个例子中,线与框号170不匹配
  • 格式在表单下方更改,很高兴忽略这一点

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

通过将中间部分改为简单的
+?
,我得到了相同的匹配。没有必要进行消极的前瞻。相反,您可以使用
+
并添加
来生成
+
,这样它就不会使用最终数字中的数字

我还建议使用
$
匹配行尾

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

在优化您的正则表达式后,我提出了以下建议:

^
(\d{1,3})
\b
.+?
\b
([\d.,]+)
\n
为相同的匹配执行20438个步骤


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

对已接受的版本有轻微的改进

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

PS先前

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

20750步 18场比赛

威尔以小数目失败


PS.(在scriptmonster注释后更新)

您的模式等于
^(\d{1,3})\s+.*([\d,]+)\n
。惰性点模式总是比右侧边界模式的贪婪令牌更有效。看,这在@Chris上可能更好。不,代码审查是针对已经完成了您希望它完成的任务的代码。这段代码不符合OP的要求。@LightnessRacesinOrbit,不是吗?在我看来,这是“可行的,但效率不高”。关于提高性能的问题更适合这里还是代码审查?我相信后者。我想知道这里的预期答案是什么。在这里,在步骤上有多少改进被认为是“正确”的答案?顺便说一句,模式是动态的还是静态的?有趣的是,使用$匹配行尾而不是\n使用另一个~1k步数。但是我想它更可靠。您需要将
+
更改为lazy
+?
。否则它不会捕获所有数字。巧妙地使用单词边界!这个答案是错误的。它只匹配8次。最后一部分
(\d+(?:,)\d+
是错误的。有些数字不包含逗号,有些数字同时包含逗号和点。例如
1234
3200.00
不匹配。如果仍然不正确,则是您弄错了。最后一部分不正确匹配,请检查匹配的行。
^(\d{1,3})\s.+?\b(\d+,?\d+\.?\d+)\n