单个大正则表达式比一堆小正则表达式效率更高吗?

时间:2017-07-14 10:08:53

标签: python regex python-3.x

我正在处理一个使用正则表达式的函数来查找作为参数给出的(非常长的)字符串中的一些产品代码。

该代码有许多可能的形式,例如:

UK[A-z]{10}DE[A-z]{20}PL[A-z]{7}或......

哪种解决方案会更好?许多(大概20-50左右)小正则表达式或一个巨大的怪物正则表达式匹配它们全部?什么是性能更好?

1 个答案:

答案 0 :(得分:3)

这取决于你写的是什么样的大正则表达式。如果以病态模式结束,最好测试较小的模式。例如:

UK[A-Za-z]{10}|DE[A-Za-z]{20}|PL[A-Za-z]{7}

这种模式非常低效,因为它以交替开始,这意味着在最坏的情况下(不匹配),需要对字符串中的所有位置测试每个替代方案。

但是如果你写这样的模式:

(?=[UDP][KEL])(?:UK[A-Za-z]{10}|DE[A-Za-z]{20}|PL[A-Za-z]{7})

或变体:

[UDP][KEL](?:(?<=UK)[A-Za-z]{10}|(?<=DE)[A-Za-z]{20}|(?<=PL)[A-Za-z]{7})

在交替之前很快就会丢弃大多数无法匹配的位置。

此外,当您编写单个模式时,显然,该字符串仅被解析一次。