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