我刚刚在regex101编辑器中构建了此表达式,以从已转换为txt的表单中提取数字。您可以在这里查看正则表达式和样本数据:https://regex101.com/r/P1458h/1/。
^
(\d{1,3})\s+
(?:(?![\d,.]+\n).)+
([\d.,]+)\n
问题:步数超过141k,效率很低。知道我该如何改善吗?
数据源是从PDF中提取的多行txt,导致输出效果不尽人意。
我正在尝试提取框号以及特定行中存在(填写)的任何数字。如果您查看上面的链接,则可以看到完整的示例。 例如:
下面是Regex101的屏幕截图,显示了正面匹配。最上面一行匹配显示框号(155)和框号(34243)。
限制/要知道:
任何帮助将不胜感激!谢谢。
答案 0 :(得分:4)
优化您的正则表达式后,我想到了这一点:
^
(\d{1,3})
\b
.+?
\b
([\d.,]+)
\n
Updated Regex Demo 执行20438个步骤来进行相同的匹配次数
如果输入的行尾不同,也可以用\n
替换最后一个$
。
答案 1 :(得分:0)
通过将中间部分更改为简单的.+?
,我得到了相同的匹配项。无需进行负面的前瞻。相反,您可以使用.+
并添加?
来制作+
non-greedy,这样它就不会消耗最终数字中的数字。
我还建议使用$
来匹配行尾。
^
(\d{1,3})
.+?
([\d.,]+)
$
答案 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评论之后更新)