关于正则表达式(特别是python re),如果我们忽略表达式的写法,那么文本的长度是处理文档所需时间的唯一因素吗?或者是否还有其他因素(如文本的结构)也扮演重要角色?
答案 0 :(得分:6)
一个重要的考虑因素也可能是文本是否与正则表达式实际匹配。从this regex tutorial获取(作为一个人为的例子)正则表达式(x+x+)+y
。
当应用于xxxxxxxxxxy
匹配时,采用正则表达式引擎7步。当应用于xxxxxxxxxx
时,它会失败(当然),但需要引擎2558步才能得出这个结论。
对于xxxxxxxxxxxxxxy
与xxxxxxxxxxxxxx
,它已经是7对40958步,依此指数......
对于嵌套重复或正则表达式,这种情况尤其容易发生,其中相同的文本可以由正则表达式的两个或更多不同部分匹配,迫使引擎在能够声明失败之前尝试所有排列。这被称为灾难性的回溯。
答案 1 :(得分:4)
文本的长度及其内容都很重要。
作为示例,正则表达式a+b
将无法在包含一百万b
s的字符串上快速匹配,但在包含一百万a
s的字符串上更慢。这是因为在第二种情况下需要更多的回溯。
import timeit
x = "re.search('a+b', s)"
print timeit.timeit(x, "import re;s='a'*10000", number=10)
print timeit.timeit(x, "import re;s='b'*10000", number=10)
结果:
6.85791902323
0.00795443275612