question that I answered让我想知道:
如何在Python中实现正则表达式?那里有什么样的效率保证?实施是“标准的”,还是可以改变?
我认为正则表达式将作为DFA实现,因此非常有效(最多需要对输入字符串进行一次扫描)。 Laurence Gonsalves提出了一个有趣的观点,即并非所有Python正则表达式都是常规的。 (他的例子是r“(a +)b \ 1”,它匹配a的一些数字,一个b,然后是与之前相同数量的a)。使用DFA显然无法实现这一点。
那么,重申一下:Python正则表达式的实现细节和保证是什么?
如果有人可以给出某种解释(根据实现),为什么正则表达式“cat | catdog”和“catdog | cat”导致字符串“catdog”中的不同搜索结果,这也是很好的“,正如question that I referenced before中提到的那样。
答案 0 :(得分:18)
Python的re模块基于PCRE,但已经转移到他们自己的实现。
以下是C code的链接。
当采用不正确的路径时,似乎库是基于递归回溯的。
正则表达式和文字大小n
a n a n 匹配 n
请注意,此图表不代表正常的正则表达式搜索。
答案 1 :(得分:7)
Python RE上没有“效率保证”,而不是语言的任何其他部分(C ++的标准库是我所知道的唯一广泛的语言标准,试图建立这样的标准 - 但是没有标准,甚至在C ++中,指定,例如,乘以两个整数必须花费恒定的时间,或类似的东西);也不保证任何时候都不会应用大的优化。
今天,F。Lundh(最初负责实现Python当前的RE模块等),在Pycon Italia上展示Unladen Swallow,提到他们将要探索的一个途径是将正则表达式直接编译为LLVM中间代码(而不是他们自己的字节码风格由ad-hoc运行时解释 - 因为普通的Python代码也被编译到LLVM(在即将发布的Unladen Swallow版本中),RE及其周围的Python代码可能是一起优化,有时甚至以非常激进的方式。我怀疑这样的事情很快就会接近“生产就绪”,但是 - )。
答案 2 :(得分:2)
Matching regular expressions with backreferences is NP-hard,至少与NP-Complete一样难。这基本上意味着它与您可能遇到的任何问题一样困难,并且大多数计算机科学家认为在最坏的情况下它可能需要指数时间。如果你可以在多项式时间内匹配这些“常规”表达式(在技术意义上确实不是这样),你可以赢得a million bucks。