我写了一个小而朴素的正则表达式,它应该在括号内找到文本:
re.search(r'\((.|\s)*\)', name)
我知道这不是最好的方法,有几个原因,但它工作得很好。我正在寻找的只是一个解释,为什么对于某些字符串,这个表达式开始以指数方式更长,然后永远不会结束。昨晚,在运行此代码几个月后,我们的一台服务器突然卡住了与以下类似的字符串匹配:
x (y) z
我已经对其进行了试验,并确定“y”和“z”之间的每个空格所花费的时间加倍:
In [62]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (22 * ' ') + 'z')
1 loops, best of 3: 1.23 s per loop
In [63]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (23 * ' ') + 'z')
1 loops, best of 3: 2.46 s per loop
In [64]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (24 * ' ') + 'z')
1 loops, best of 3: 4.91 s per loop
但空格以外的字符也没有相同的效果:
In [65]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (24 * 'a') + 'z')
100000 loops, best of 3: 5.23 us per loop
注意:我不是在寻找更好的正则表达式或解决此问题的其他方法。我们不再使用它。