Python—为什么正则表达式比列表中的搜索效率高很多?
当我看了一看2009年Google代码阻塞资格赛的问题时,简单的想法是从模式中生成所有可能的字符串,并将其保存在列表中,然后测试和计算匹配的字符串。这个算法简单明了,但它消耗了难以置信的大内存,你的笔记本电脑肯定会死掉 解决此问题的另一种方法是使用正则表达式将Python—为什么正则表达式比列表中的搜索效率高很多?,python,regex,Python,Regex,当我看了一看2009年Google代码阻塞资格赛的问题时,简单的想法是从模式中生成所有可能的字符串,并将其保存在列表中,然后测试和计算匹配的字符串。这个算法简单明了,但它消耗了难以置信的大内存,你的笔记本电脑肯定会死掉 解决此问题的另一种方法是使用正则表达式将“()”替换为“[]”。Python embeddedre.match()和string.replace()花了不到几秒钟的时间通过了大型测试。现在的问题是,为什么正则表达式更强大 在我的理解中,可能有某种机制,比如yield函数,使您能够
“()”
替换为“[]”
。Python embeddedre.match()
和string.replace()
花了不到几秒钟的时间通过了大型测试。现在的问题是,为什么正则表达式更强大
在我的理解中,可能有某种机制,比如
yield
函数,使您能够生成一个“生成器”-iterable和一个pass。但这是我的猜测。你的直觉基本上是正确的
有关计算机科学的详细信息,您可以查阅“”和“”的概念
您可以将regexp编译器视为接受regexp并生成一个函数的东西,该函数对您的输入字符串进行操作并保持一个状态,当它根据从regexp派生的规则使用输入字符串时,该状态会更新
如果我从概念上说,比如说,(ab | cd)
的regexp将产生如下行为,那么我希望我不会对事情进行太多的破坏:
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
因此,对于许多简单的正则表达式,可以生成只需要使用输入字符串中的每个字符一次的机器。但是请记住,有些正则表达式不能很好地发挥作用,例如
哦,还有这个。您可以将它生成的第一张图片视为一个中间步骤,第二张图片可以翻译成上述机器。通过regexp进行搜索不需要生成所有可能与regexp匹配的字符串。。这是你问题的关键吗?@AndrewMagee它是如何实现的?像这样的文件没有解释。DFA的想法在这里会很有帮助。我以前见过DFA,但从未想过正则表达式可以用这种方式实现。我认为这只是某种形式化的工具,在实践中毫无用处。错。好的,谢谢你。