Python - 为什么正则表达式比列表中的搜索更有效?

时间:2015-03-13 05:09:37

标签: python regex

当我查看 Google Code Jam资格赛2009问题Alien Language时,一个简单的想法是,您可以从模式中生成所有可能的字符串,并将其保存在列表,然后测试和计算匹配的字符串。这个算法很简单,直接,但它消耗了非常大的内存,你的笔记本电脑无疑会死掉。

解决此问题的另一种方法是将"()"替换为"[]"以使用正则表达式。 Python嵌入式re.match()string.replace()花了不到几秒的时间来通过大型测试。现在的问题是,为什么正则表达式更强大?

根据我的理解,可能有某种机制,如yield功能,可以让你生成一个"生成器" - 可迭代,一次通过。但这是我的猜测。

1 个答案:

答案 0 :(得分:1)

你的直觉基本上是正确的。

有关计算机科学的详细信息,您可以查看“nondeterministic finite automaton”和“deterministic finite automaton”的想法。

您可以将正则表达式编译器视为采用正则表达式并生成函数的函数,该函数对您的输入字符串进行操作并保持状态,当它根据规则使用输入字符串时它会更新源自正则表达式。

希望如果我从概念上说这个问题,我就不会过多地抨击事情,例如(ab|cd)的正则表达会产生这样的行为:

def match_ab_or_cd(s):
    state = "start"
    for c in s:
        if state == "start":
            if c == "a":
                state = "state_a"
            elif c == "c":
                state = "state_c"
        elif state == "state_a":
            if c == "b":
                return True
            elif c == "a":
                state = "state_a"
            else:
                state = "start"
        elif state == "state_c":
            if c == "d":
                return True
            elif c == "c":
                state = "state_c"
            else:
                state = "start"
    return False


>>> match_ab_or_cd("ab")
True
>>> match_ab_or_cd("cd")
True
>>> match_ab_or_cd("ae")
False
>>> match_ab_or_cd("aaaaab")
True

因此,对于许多简单的正则表达式,可以生成只需要消耗输入字符串中的每个字符一次的机器。请记住,虽然有正则表达不能很好地发挥作用,例如(x+x+)+y

哦,这是a fun tool that visualises how regular expressions turn into state machines。您可以将其生成的第一张图片视为中间步骤,第二张图片可以转换为如上所述的机器。