为什么在Python中捕获组时正则表达式搜索速度较慢?

时间:2017-01-03 13:38:59

标签: python regex

我有一个动态生成正则表达式的应用程序代码 从一个配置进行一些解析。 当两种变化的时序性能,正则表达式的变化 正在捕获的正则表达式的每个部分都明显慢于 正常的正则表达式。 原因是regex模块内部某些操作的开销。

server unix:/home/axx/apps/axx/tmp/sockets/unicorn.axx.sock

问题:使用捕获组时,导致性能大幅下降的原因是什么?

2 个答案:

答案 0 :(得分:19)

原因很简单,使用捕获组指示引擎将内容保存在内存中,而使用非捕获组则表示引擎不保存任何内容。请考虑您告诉引擎执行更多操作。

例如,使用此正则表达式(hello|bye|ola|cheers)(hello)|(bye)|(ola)|(cheers)会比使用原子组或非捕获原则组((?:hello|bye|ola|cheers)的影响大得多。

使用正则表达式时,您知道是否要捕获或不捕获上述情况的内容。如果您想捕获任何这些单词,您将失去性能,但如果您不需要捕获内容,那么您可以通过改进它来保存性能,就像使用非捕获组一样

我知道你标记了python,但已经为javascript编写了一个在线基准,以显示捕获和非捕获组如何影响js正则表达式引擎。

https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

https://jsperf.com/capturing-groups-vs-non-capturing-groups

答案 1 :(得分:11)

您的模式仅在捕获组中有所不同。在正则表达式模式中定义捕获组并将模式与re.search一起使用时,结果将是MatchObject实例。每个匹配对象将包含尽可能多的,因为模式中有捕获组,即使它们是空的。这是re内部的开销:添加(列表)组(内存分配等)。请注意,群组还包含the starting and ending index of the text that they match等详细信息(请参阅MatchObject reference)。