包含100多个组的Python正则表达式?

Eva*_*ark 21 python regex

有没有办法超过Python中正则表达式的100组限制?此外,有人可以解释为什么有一个限制.

Kel*_*tia 10

存在一个限制因为它需要太多内存才能有效地存储完整的状态机.我要说的是,如果你的组中有超过100个组,那么在re本身或你使用它们的方式上都有问题.也许你需要拆分输入并处理较小的块或其他东西.

  • 对不起,但我不同意 - 什么是"太多内存",为什么模块会硬编码这个阈值?有这种用法合理的(罕见)情况.我(遗憾地)自己遇到过这样的情况.我正在使用pyparsing解析一个复杂的语法,并且(唉)发现pyparsing太慢了.我现在正在自动生成一个正则表达式来匹配我的语法(我已经击中了硬编码的`100`砖墙). (14认同)

zan*_*bri 9

我找到了最简单的方法

import regex as re
Run Code Online (Sandbox Code Playgroud)

代替

import re
Run Code Online (Sandbox Code Playgroud)

正则表达式的默认_MAXCACHE是500而不是100我相信.这是我发现正则表达式比re更好的模块的众多原因之一.

  • 我没有这个模块 (4认同)
  • pip install regex (2认同)

Ste*_*ven 6

如果我没有弄错的话,"新" 正则表达式模块(目前是第三方,但最终会替换stdlib中的re模块)没有这个限制,所以你可以尝试一下.


rol*_*ish 6

我怀疑你真的需要通过下一个命令处理100个命名组或在regexp替换命令中使用它.这将是非常不切实际的.如果您只需要群组来表达丰富的条件,regexp您可以使用非分组.

(?:word1|word2)(?:word3|word4)
Run Code Online (Sandbox Code Playgroud)

包括嵌套组在内的复杂场景也是可能的.非分组组没​​有限制.

  • 这不是问题的答案. (3认同)

Jim*_*oll 5

我不确定您到底在做什么,但是尝试使用一个组,其中包含许多OR子句...,这样(this)|(that)变成(this | that)。您可以通过传递对匹配的特定单词执行某些操作的函数来对结果进行巧妙的处理:

 newContents, num = cregex.subn(lambda m: replacements[m.string[m.start():m.end()]], contents)
Run Code Online (Sandbox Code Playgroud)

如果您真的需要这么多的小组,则可能必须分阶段进行……一次通过一大批小组,然后在每个小组内通过另一次小组讨论所需的所有细节。