2014-02-15 166 views
2

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

+0

好问题。 Python使用反向跟踪引擎,所以我猜它不关心这个长度。 gt和lt操作可能会发挥作用。 –

+1

您可以通过测量应用正则表达式输入不同长度的字符串所需的时间来找出自己。如果当字符串是一个太短的字符时就会看到时间的急剧减少,这表明您的正则表达式引擎会执行此类检查。 (尽管我发现这种情况不太可能,但你当然不能推广到不同的正则表达式引擎,特别是如果表达式比“a {1000}”更复杂,那么说明最小长度变得越来越困难,而这种检查的潜在好处开始消失。 ) – Tomalak

+0

谢谢你的回答:) – nan

回答

1

特别是我很想知道Python的重新模块是否做到这一点。

测量表明它确实。

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.0491882176
0.04305112491748375 
60.76094317352544 
相关问题