Estoy tratando de encontrar una expresión regular en Python que tenga que coincidir con cualquier carácter pero evitando tres o más comas consecutivas o puntos y comas. En otras palabras, solo se permiten hasta dos comas o puntos y coma consecutivos.100% de uso de CPU con una expresión regular dependiendo de la longitud de entrada
Así que esto es lo que tengo actualmente:
^(,|;){,2}([^,;]+(,|;){,2})*$
Y parece que funciona como se esperaba:
>>> r.match('')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo,')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, a')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, ,')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, ,,a')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, ,,,')
>>> r.match('foo, ,,,;')
>>> r.match('foo, ,, ;;')
<_sre.SRE_Match object at 0x7f23af840750>
Pero cuando me preparo para aumentar la longitud del texto de entrada, la expresión regular parece necesitar mucho más tiempo para dar una respuesta.
>>> r.match('foo, bar, baz,, foo')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, bar, baz,, fooooo, baaaaar')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, bar, baz,, fooooo, baaaaar,')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, bar, baz,, fooooo, baaaaar,,')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, bar, baz,, fooooo, baaaaar,,,')
>>> r.match('foo, bar, baz,, fooooo, baaaaar,,,,')
>>> r.match('foo, bar, baz,, fooooo, baaaaar, baaaaaaz,,,,')
Y, finalmente, se queda completamente atascado en esta etapa y el uso de la CPU aumenta al 100%.
No estoy seguro si la expresión regular podría ser optimizada o hay algo más involucrado, cualquier ayuda apreciada.
La implementación de expresiones regulares en PyPI es mucho menos propensa a este tipo de problema. – MRAB
Thas fue una gran explicación, es bueno saber el origen del problema. Creo que iré con la verificación inversa por ahora y descartaré la expresión regular. ¡¡Gracias!! – julen