单个大正则表达式是否比一堆小正则表达式更有效?

mae*_*ica 3 python regex python-3.x

我正在研究一个函数,该函数使用正则表达式在作为参数给出的(很长)字符串中查找一些产品代码。

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

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

什么解决方案会更好?许多(很可能大约 20-50 个)小的正则表达式或一个匹配它们的巨大的正则表达式?就性能而言,什么更好?

Cas*_*yte 5

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

UK[A-Za-z]{10}|DE[A-Za-z]{20}|PL[A-Za-z]{7}
Run Code Online (Sandbox Code Playgroud)

这种模式非常低效,因为它以交替开始,这意味着在最坏的情况下(没有匹配),需要针对字符串中的所有位置测试每个备选。
(* 请注意,当交替的每个分支以文字字符开头时,像 PCRE 这样的正则表达式引擎能够快速找到可能匹配的位置。)

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

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

或变化:

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

大多数不可能匹配的位置在交替之前很快就被丢弃了。

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