Otra información teórica de posible interés.
Para mayor claridad, asumen la definición estándar para una expresión regular
http://en.wikipedia.org/wiki/Regular_language
de la teoría del lenguaje formal. Prácticamente, esto significa que el único material de construcción son símbolos del alfabeto, operadores de concatenación, la alternancia y cierre Kleene, junto con la unidad y cero constantes (que aparecen para razones de grupos teórico). En general, es una buena idea no sobrecargar este término a pesar de la práctica diaria en lenguajes de scripting que conduce a ambigüedades.
Hay una construcción NFA que resuelve el problema de la concordancia de un habitual expresión r y un texto de entrada t en O (| r | | t |) tiempo y O (| r |) el espacio, donde | - | es la función de longitud. Este algoritmo se ha mejorado aún más por Myers
http://doi.acm.org/10.1145/128749.128755
al tiempo y el espacio complejidad O (| r | | t |/log | t |) mediante el uso de listados de nodo autómata y el paradigma cuatro rusos. Este paradigma parece tener el nombre de cuatro tipos rusos que escribieron un documento innovador que no es en línea. Sin embargo, el paradigma se ilustra en ellas la biología computacional notas de clase
http://lyle.smu.edu/~saad/courses/cse8354/lectures/lecture5.pdf
me resulta hilarante para nombrar un paradigma por el número y la nacionalidad de los autores en lugar de sus apellidos.
El problema a juego para expresiones regulares con backreferences añadido es NP-completo, el cual fue probado por Aho
http://portal.acm.org/citation.cfm?id=114877
por una reducción del problema de vértice de la cubierta que es un clásico problema NP-completo .
para que coincida con las expresiones regulares con referencias hacia atrás de forma determinista podríamos retroceso empleo (no muy diferente del motor de expresiones regulares de Perl) para realizar un seguimiento de los posibles palabras parciales del texto de entrada t que se pueden asignar a las variables en r. Solo hay subwords O (| t |^2) que se pueden asignar a cualquier variable en r. Si hay n variables en r, entonces hay O (| t |^2n) asignaciones posibles . Una vez que se ha solucionado la asignación de subcadenas a variables, el problema se reduce a la coincidencia de expresiones regulares simples. Por lo tanto, la complejidad del peor caso para emparejar expresiones regulares con referencias hacia atrás es O (| t |^2n).
Obsérvese, sin embargo, las expresiones regulares con referencias hacia atrás son todavía no regexen con todas las funciones.
Tomemos, por ejemplo, el "no me importa" símbolo aparte de cualquier otro operadores. Hay varios algoritmos polinomiales que determinan si un conjunto de patrones coincide con un texto de entrada.Por ejemplo, Kucherov y Rusinowitch
http://dx.doi.org/10.1007/3-540-60044-2_46
definir un patrón como una palabra w_1 @ w_2 @ ... @ w_n donde cada w_i es una palabra (no una expresión regular) y "@" es una longitud variable el símbolo "no me importa" no está incluido en ninguno de los w_i. Derivan un algoritmo O ((| t | + | P |) log | P |) para hacer coincidir un conjunto de patrones P con un texto de entrada t, donde | t | es la longitud del texto, y | P | es la longitud de todas las palabras en P.
Sería interesante saber cómo se combinan estas medidas de la complejidad y lo es la medida de la complejidad del problema de la concordancia de expresiones regulares con referencias hacia atrás, "no importa" y otras características interesantes de las expresiones regulares prácticas .
Por desgracia, no he dicho una palabra sobre Python ... :)
¿La complejidad sigue siendo lineal cuando se considera el rastreo de retroceso según lo necesiten algunos cuantificadores? – Joey
Estoy interesado en una prueba para "Esto se hace en O (2^m), siendo m el tamaño de la expresión regular, usando un algoritmo estándar". Como se te ocurrió? –
¿Hay una serie de armónicos para el número de operaciones en la situación extrema? –