我想知道一个RegEX引擎,在尝试匹配正则表达式之前,检查数据是否具有正则表达式所需的最小长度。 例如,由999“a”组成的数据中的正则表达式“a {1000}”失败。 可以获得结果,避免应用正则表达式,并且仅对数据的长度(以及正则表达式的最小值)执行一些检查。 那么,一般来说,RegEX引擎会执行这种测试吗?特别是我很想知道Python的 re 模块是否可以做到这一点。
答案 0 :(得分:1)
特别是我很想知道Python的re模块是否可以做到这一点。
测量表明它确实存在。
import re
import timeit
def test(charsInString, charsInRegex):
regex = re.compile('a{'+str(charsInRegex)+'}')
string = 'a'*charsInString;
for i in range(1, 200000):
regex.match(string)
print(timeit.timeit("test(1, 1)", setup="from __main__ import test", number=1))
print(timeit.timeit("test(1, 2)", setup="from __main__ import test", number=1))
print(timeit.timeit("test(1, 5000)", setup="from __main__ import test", number=1))
print(timeit.timeit("test(4999, 5000)", setup="from __main__ import test", number=1))
print(timeit.timeit("test(5000, 5000)", setup="from __main__ import test", number=1))
print(timeit.timeit("test(50000, 5000)", setup="from __main__ import test", number=1))
输出:
0.9117504503834146
0.8135033788142646
0.819454105947109
0.8154557798237785
15.441637204298287
15.412751909222905
更复杂的一个:
import re
import timeit
def test2(charsInString):
regex = re.compile('((ab{3,5}c+){5000,6000}d)+e*f')
string = 'abbbbcc'*charsInString;
for i in range(1, 100000):
regex.match(string)
print(timeit.timeit("test2(1)", setup="from __main__ import test2", number=1))
print(timeit.timeit("test2(3571)", setup="from __main__ import test2", number=1))
print(timeit.timeit("test2(3572)", setup="from __main__ import test2", number=1))
输出:
0.04918821760123643
0.04305112491748375
60.76094317352544