我首先想到的是具有正則表達式引擎採取的處理這一切的麻煩。它們通常被優化來處理大量的文本,所以它不應該成爲性能問題。這是蠻力,但表現似乎沒問題。你可以將輸入分成幾部分,並有多個進程處理它們。這是我經過適度測試的解決方案(使用Python)。
import random
import string
import re
def create_random_sentence():
nwords = random.randint(4, 10)
sentence = []
for i in range(nwords):
sentence.append("".join(random.choice(string.lowercase) for x in range(random.randint(3,10))))
ret = " ".join(sentence)
print ret
return ret
patterns = [ r"Hi there, [a-zA-Z]+.",
r"What a lovely day today!",
r"Lovely sunset today, [a-zA-Z]+, isn't it?",
r"Will you be meeting [a-zA-Z]+ today, [a-zA-Z]+\?"]
for i in range(95):
patterns.append(create_random_sentence())
monster_pattern = "|".join("(%s)"%x for x in patterns)
print monster_pattern
print "--------------"
monster_regexp = re.compile(monster_pattern)
inputs = ["Hi there, John.",
"What a lovely day today!",
"Lovely sunset today, John, isn't it?",
"Will you be meeting Linda today, John?",
"Goobledigoock"]*2000
for i in inputs:
ret = monster_regexp.search(i)
if ret:
print ".",
else:
print "x",
我創建了一百個模式。這是python regexp庫的最大限制。其中4個是你的實際例子,其餘的都是隨機句,只是爲了強調一點。
然後我將它們組合成一個包含100個組的單個正則表達式。 (group1)|(group2)|(group3)|...
。我猜你必須對正則表達式中的含義進行消毒處理(如?
等)。這是monster_regexp
。
根據此測試一個字符串在單次測試中對100個模式進行測試。有一些方法可以找出匹配的確切組。我測試了10000個字符串,其中80%應該匹配,10%不會。它縮短了成本,所以如果取得成功,它會比較快。失敗將不得不貫穿整個正則表達式,所以它會變慢。您可以根據輸入頻率排序,以獲得更多性能。
我在我的機器上運行了這個,這是我的計時。
python /tmp/scratch.py 0.13s user 0.00s system 97% cpu 0.136 total
這是不是太糟糕。
但是,要對這麼大的正則表達式的模式和失敗將需要更長的時間,所以我改變了輸入有大量隨機生成的字符串,將不匹配,然後嘗試的。 10000個字符串,其中沒有一個匹配monster_regexp,我得到了這個。
python /tmp/scratch.py 3.76s user 0.01s system 99% cpu 3.779 total
要求的性能是什麼?對1500個字符串的正則表達式不可能是地球上最快的東西......你可以從一些字符開始,也許只是第一個字符(不包括空格),然後傳遞給正則表達式。 – lunadir 2013-05-07 06:47:34
@lunadir表演必須是一流的。我必須每秒處理大約6000個這樣的字符串,但我可以使用多個進程。我已經保持了性能,因爲我希望首先有一個基本的工作解決方案。 – 2013-05-07 06:54:45
@lunadir此外,它不需要是一個正則表達式。它可以是1500個不同的正則表達式以及一些if/else語句,如果這有助於獲得更好的性能,則在JS中的預生成函數(由new function創建)內運行。 – 2013-05-07 06:56:23