有没有办法超越Python中正则表达式的100组限制?此外,有人可以解释为什么有限制。
答案 0 :(得分:10)
存在一个限制,因为它需要太多内存才能有效地存储完整的状态机。我要说的是,如果你的组中有超过100个组,那么在re本身或你使用它们的方式上都有问题。也许你需要分割输入并处理较小的块或其他东西。
答案 1 :(得分:8)
我发现最简单的方法是
import regex as re
而不是
import re
正则表达式的默认_MAXCACHE是500而不是100我相信。这是我发现正则表达式比re更好的模块的众多原因之一。
答案 2 :(得分:6)
如果我没弄错的话,“新”regex模块(目前是第三方,但最终会替换stdlib中的re模块)没有这个限制,所以你可能会给它一个尝试。
答案 3 :(得分:6)
我怀疑你真的需要通过下一个命令处理100个命名组,或者在regexp
替换命令中使用它。这将是非常不切实际的。如果您只需要群组来表达regexp
中的丰富条件,则可以使用非分组。
(?:word1|word2)(?:word3|word4)
等。包括嵌套组在内的复杂场景也是可能的。 非分组没有限制。
答案 4 :(得分:5)
我不确定你在做什么,但是尝试使用一个组,里面有很多OR子句......所以(这)|(那)变成(这个|那个)。通过传递一个与匹配的特定单词有关的函数,你可以对结果做一些聪明的事情:
newContents, num = cregex.subn(lambda m: replacements[m.string[m.start():m.end()]], contents)
如果你真的需要这么多团体,你可能需要分阶段进行...一次传递给十几个大组,然后另一组传递给每个组,以获得你想要的所有细节。
答案 5 :(得分:3)
首先,正如其他人所说,使用100组可能有很好的替代方案。 re.findall
方法可能是一个有用的起点。如果您确实需要超过100个组,我看到的唯一解决方法是修改核心Python代码。
在[python-install-dir]/lib/sre_compile.py
中,只需删除以下行即可修改compile()
功能:
# in lib/sre_compile.py
if pattern.groups > 100:
raise AssertionError(
"sorry, but this version only supports 100 named groups"
)
对于稍微灵活的版本,只需在sre_compile
模块的顶部定义一个常量,并将上面的行与该常量进行比较,而不是100。
有趣的是,在(Python 2.5)源代码中有一条注释表明计划在将来的版本中删除100组限制。
答案 6 :(得分:0)
当我碰到这个时,我有一个非常复杂的模式,实际上是由一组由OR连接的高级模式组成的,如下所示:
pattern_string = u"pattern1|" \
u"pattern2|" \
u"patternN"
pattern = re.compile(pattern_string, re.UNICODE)
for match in pattern.finditer(string_to_search):
pass # Extract data from the groups in the match.
作为一种解决方法,我将模式转换为列表,我按如下方式使用该列表:
pattern_strings = [
u"pattern1",
u"pattern2",
u"patternN",
]
patterns = [re.compile(pattern_string, re.UNICODE) for pattern_string in pattern_strings]
for pattern in patterns:
for match in pattern.finditer(string_to_search):
pass # Extract data from the groups in the match.
string_to_search = pattern.sub(u"", string_to_search)
答案 7 :(得分:0)
我发现Python 3没有此限制,而最新2.7版中运行的相同代码会显示此错误。
答案 8 :(得分:-1)
我想说你可以通过使用非分组括号来减少组的数量,但无论你做什么,你似乎都想要所有这些分组。
答案 9 :(得分:-1)
在我的情况下,我有一个n个单词的字典,想要创建一个匹配所有单词的正则表达式..即:如果我的字典是
hello
goodbye
我的正则表达式是:(^|\s)hello($|\s)|(^|\s)goodbye($|\s)
...这是唯一的方法,并且可以在小字典上正常工作,但是当你有更多的棕褐色50字时,那么...
答案 10 :(得分:-2)
解决此错误非常容易:
打开re
课程,您会看到此常量_MAXCACHE = 100
。
例如,将值更改为1000
并进行测试。