【问题标题】:regular expression code size limit exceeded python正则表达式代码大小限制超出python
【发布时间】:2016-01-08 21:27:52
【问题描述】:

我正在使用 dict 文件和正则表达式来更改脚本中的一些单词,但现在遇到了这个错误

在插件
超出正则表达式代码大小限制

我的 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 个正则表达式,例如从多个字符串中删除单词和数字。

我得到错误的原因是什么?如果我删除了我的 dict,如果我有 300 个条目,它就可以工作。

从谷歌调查,大多数人说字典大小没有限制。

【问题讨论】:

  • 我尝试使用 99,000 个元素的字典(基于英文单词列表)重现您的错误,但代码运行良好。一个更完整的例子会有所帮助,但鉴于字典有 5000 个条目,这很棘手。
  • 如果我没记错的话,限制是正则表达式的长度。只需以较小的块浏览字典并为它们中的每一个进行替换。
  • 长度是什么意思?就像一行代码一样?
  • @Roy Yorke 如果需要,可以从 git hub 下载字典
  • 我不太确定,但我认为正则表达式只是有大小限制。

标签: python regex dictionary


【解决方案1】:

正如 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 是你的类别

【讨论】:

  • 好的,所以我将上面的代码移动到脚本的一部分以查找列表中的 3 个内容,但仍然出现错误?
  • 可以拆分字典吗?然后说寻找road-use= {'RD': 'Road'} Directions= {'NE': 'North East'}
  • 我猜您没有任何上下文可以将 dict 拆分为您建议的类别。你要么必须手动完成,要么split the dict into chunks
  • 手动操作并不像已经在“部分”中使用#那么难,所以如果我改变它,我将如何完成所说的方式?
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 2013-07-25
  • 2021-07-31
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
相关资源
最近更新 更多