每条字符串数据都要循环匹配大概 200 左右的正则表达式,怎么做速度可以快点?

2023-07-06 16:51:24 +08:00
 daxin945

我定义了一个数组,长度目前是 200 ,未来应该会更长,数组内元素都是 re.compile 大概长这样 _list = [ (re.compile("正则表达式 1", re.IGNORECASE), (re.compile("正则表达式 2", re.IGNORECASE), ]

正则表达式中有若干 .* 的操作,但是能避免的都避免了 在取值的时候我用的 re.findall()

每来一个新的字符串,都要遍历一遍数组,再加上正则表达式,感觉速度很慢 想请教有没有什么更好的方法

3121 次点击
所在节点    Python
23 条回复
yesterdaysun
2023-07-07 09:48:48 +08:00
我支持合并正则的方案, 在以前的类似的案例里面, 把一批 200 个左右的正则合成 1 个, 能够提高 30 倍左右的效率, 当然这个和具体的数据有关系, 但是说明这个方案是可行的.

原理我猜应该就是合并后的正则, 引擎编译时会自动优化形成类似 DFA 的数据结构或者算法, 合并正则可能也要一定的优化, 比如排序, 尽可能让有相同前缀的放在一组, 然后也要优化一些.*这样的写法, 就不同的方案都简单试试, 套入实际数据看看那种效率会变高
snylonue
2023-07-07 17:18:09 +08:00
rust 的 regex 有 RegexSet ,可以找找有没有 python 绑定
kaneg
2023-07-07 20:02:40 +08:00
还有一个思路,如果说这些正则匹配率差异比较大,可以给正则按照匹配的命中率动态排序,这样可以尽可能早地匹配到。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/954626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX