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

时间:2009-01-25 22:48:56

标签: python regex

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

11 个答案:

答案 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并进行测试。