2015-10-11 74 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) –