¿Por qué mi patrón de expresión regular de Python se ejecuta tan lentamente?

Por favor vea mi código de patrón de expresión regular:

#!/usr/bin/env python # -*- coding:utf-8 -*- import re print 'Start' str1 = 'abcdefgasdsdfswossdfasdaef' m = re.match(r"([A-Za-z\-\s\:\.]+)+(\d+)\w+", str1) # Want to match something like 'Moto 360x' print m # None is expected. print 'Done' 

Se tarda 49 segundos en terminar, ¿algún problema con el patrón?

Ver Runaway Regular Expressions: Retrocesos catastróficos .

En resumen, si hay muchas combinaciones, una subcadena se puede dividir en partes de la expresión regular, el comparador de expresiones regulares puede terminar probándolas todas.

Las construcciones como (x+)+ y x+x+ prácticamente garantizan este comportamiento.

Para detectar y corregir las construcciones problemáticas, se puede utilizar el siguiente concepto:

  • A nivel conceptual, la presencia de una construcción problemática significa que su expresión regular es ambigua , es decir, si ignora el comportamiento codicioso / perezoso, no existe una división “correcta” de parte del texto en las partes de la expresión regular (o, de manera equivalente, una subexpresión del mismo) ). Por lo tanto, para evitar / solucionar los problemas, debe ver y eliminar todas las ambigüedades.

    • Una forma de hacer esto es

      • siempre divida el texto en sus partes significativas (= partes que tienen significados separados para la tarea en cuestión), y
      • defina las partes de tal manera que no se puedan confundir (= usando las mismas características que usted usaría para decir cuál es cuál si lo analizó a mano)

Solo vuelva a publicar la respuesta y la solución en los comentarios de nhahtdh y Marc B:

([A-Za-z\-\s\:\.]+)+ -> [A-Za-z\-\s\:\.]+

Muchas gracias a nhahtdh y Marc B!