当我查看 Google Code Jam资格赛2009问题:Alien Language时,一个简单的想法是,您可以从模式中生成所有可能的字符串,并将其保存在列表,然后测试和计算匹配的字符串。这个算法很简单,直接,但它消耗了非常大的内存,你的笔记本电脑无疑会死掉。
解决此问题的另一种方法是将"()"
替换为"[]"
以使用正则表达式。 Python嵌入式re.match()
和string.replace()
花了不到几秒的时间来通过大型测试。现在的问题是,为什么正则表达式更强大?
根据我的理解,可能有某种机制,如yield
功能,可以让你生成一个"生成器" - 可迭代,一次通过。但这是我的猜测。
答案 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。您可以将其生成的第一张图片视为中间步骤,第二张图片可以转换为如上所述的机器。