簡體   English   中英

與正則表達式匹配的字符串的最小長度

[英]Minimum lenght of string that match a regex

我想知道在嘗試匹配正則表達式之前,RegEX引擎是否檢查數據是否具有正則表達式所需的最小長度 例如,由999個“ a”組成的數據中的正則表達式“ a {1000}”將失敗。 可以避免使用正則表達式,而僅對數據的長度(和正則表達式的最小值)進行一些檢查,可以獲得結果。 那么,一般來說,RegEX引擎執行這種測試嗎? 我特別想知道Python的re模塊是否做到了這一點。

我特別想知道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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM