Ontem, o StackOverflow ficou inoperante por meia hora. Mais tarde, eles escreveram um post sobre o assunto , detalhando que o problema surgiu da inesperadamente alta complexidade da correspondência de expressões regulares.
Em resumo, a expressão regular a+b
, quando executada na string aaaaaaaaaaaaaac
, é executada em hora em que é o número de a
caracteres, porque usa retrocesso.
Você pode reproduzir o problema com o seguinte código Python, que no meu computador leva mais de 4 segundos para ser executado:
import re, time
start = time.time()
re.findall(r'\s+$', ' '*20000 + 'x')
print(time.time() - start)
Isso foi muito surpreendente para mim; Eu pensaria que um par de regex funciona de maneira mais eficiente, por exemplo, construindo um DFA a partir do regex e executando a string desejada através dele, o que eu pensaria que seria (não incluindo a construção do DFA).
(Por exemplo, o livro Introdução aos algoritmos de Cormen, Leiserson, Rivest passa por um algoritmo semelhante no caminho da introdução do algoritmo de Knuth-Morris-Pratt).
Minha pergunta: Existe algo inerentemente difícil na correspondência de expressões regulares que não permita umaalgoritmo , ou estamos simplesmente falando de uma implementação ineficiente (em Python, em qualquer que seja o StackOverflow, etc.)?