2015-10-11 31 views
2

我使用的字典文件和正則表達式來改變一些字的劇本,但現在遇到這個錯誤陷入插件<類的pagerprinter.plugins正則表達式的代碼大小限制超過蟒蛇

異常.tts.TTS」>
正則表達式的代碼大小限制超過

我dict有一些5300項長期載列:

'SE': 'South East', 
'NE': 'North East', 

您可以將縮寫改爲全部單詞。平均有6 - 8個縮寫被改變。

這個我使用

from abbreviations import abbreviations #mydict 
pattern = re.compile(r'\b(' + '|'.join(abbreviations.keys()) + r')\b') 
    msg = pattern.sub(lambda x: abbreviations[x.group()], msg) 

,但我也用另外4個正則表達式的其他任務,如從一些字符串刪除文字和數字。

我得到的錯誤的原因是什麼?如果我刪除了我的字典,那麼它有效,如果我有300個條目它的工作。

從谷歌的角度來看,大多數人都說dict大小沒有限制。

+0

我試圖用一個99,000元字典重現你的錯誤(基於英文單詞列表),但代碼工作正常。一個更完整的例子會有所幫助,但是鑑於5000條目字典,這是非常棘手的。 –

+1

如果我沒有弄錯,限制是在正則表達式的長度上。只需以較小的塊瀏覽詞典併爲它們中的每一個替換即可。 – L3viathan

+0

你是指長度?如同在一行代碼中一樣? – shaggs

回答

2

就像L3viathan提到的一樣。你正在構建一個需要很長時間的正則表達式模式。 這條線是你的問題:

re.compile(r'\b(' + '|'.join(abbreviations.keys()) + r')\b') 

的時間越長你的縮寫字典生長的正則表達式模式增長的時間越長。您必須使用2個正則表達式或其他解決方案。

編輯以回答以下問題,你可以做這樣的:

from abbreviations import dct1, dct2, dct3 
import re 

for dct in (dct1, dct2, dct3): 
    pattern = re.compile(r'\b(' + '|'.join(dct.keys()) + r')\b') 
    msg = pattern.sub(lambda x: dct[x.group()], msg) 

其中DCT1 2和3是你的類別

+0

好吧,所以我將上面的代碼移動到腳本的一部分,以找到列表中的3件事情,我仍然有錯誤? – shaggs

+0

是否可以將字典拆分?並且說找'road-use = {'RD':'Road'} Directions = {'NE':'North East'}' – shaggs

+0

我猜你沒有任何可以分割字典的上下文納入您建議的類別。您將不得不手動或[將字典拆分爲塊](http://stackoverflow.com/questions/22878743/how-to-split-dictionary-into-multiple-dictionaries-fast) –