与正则表达式匹配的字符串的最小长度

时间:2014-02-15 10:45:41

标签: python regex algorithm

我想知道一个RegEX引擎,在尝试匹配正则表达式之前,检查数据是否具有正则表达式所需的最小长度。 例如,由999“a”组成的数据中的正则表达式“a {1000}”失败。 可以获得结果,避免应用正则表达式,并且仅对数据的长度(以及正则表达式的最小值)执行一些检查。 那么,一般来说,RegEX引擎会执行这种测试吗?特别是我很想知道Python的 re 模块是否可以做到这一点。

1 个答案:

答案 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