Regular Expression Lookbehind no funciona con cuantificadores (‘+’ o ‘*’)

Intento utilizar lookbehinds en una expresión regular y no parece funcionar como esperaba. Entonces, este no es mi uso real, pero para simplificar voy a poner un ejemplo. Imagine que quiero hacer coincidir “ejemplo” en una cadena que dice “esto es un ejemplo”. Entonces, de acuerdo con mi comprensión de las miradas atrás, esto debería funcionar:

(?<=this\sis\san\s*?)example 

Lo que esto debería hacer es encontrar “esto es un”, luego espacio en caracteres y finalmente coincidir con la palabra “ejemplo”. Ahora, no funciona y no entiendo por qué, ¿es imposible usar ‘+’ o ‘*’ dentro de lookbehinds?

También probé esos dos y funcionan correctamente, pero no satisfacen mis necesidades:

 (?<=this\sis\san\s)example this\sis\san\s*?example 

Estoy usando este sitio para probar mis expresiones regulares: http://gskinner.com/RegExr/

Muchas bibliotecas de expresiones regulares solo permiten el uso de expresiones estrictas en aserciones que se parecen a las siguientes:

  • solo coincide con cadenas de la misma longitud fija: (?<=foo|bar|\s,\s) (tres caracteres cada una)
  • solo coincide con cadenas de longitudes fijas: (?<=foobar|\r\n) (cada twig con longitud fija)
  • solo coincide con cadenas con una longitud de límite superior: (?<=\s{,4}) (hasta cuatro repeticiones)

La razón de estas limitaciones se debe principalmente a que esas bibliotecas no pueden procesar las expresiones regulares al revés en absoluto o solo en un subconjunto limitado.

Otra razón podría ser evitar que los autores construyan expresiones regulares demasiado complejas que sean difíciles de procesar ya que tienen un comportamiento patológico (ver también ReDoS ).

Consulte también la sección sobre limitaciones de aserciones de seguimiento en Regular-Expressions.info .

Oye, si no estás usando la afirmación de python variable look behind, puedes engañar al motor de expresiones regulares escapando de la coincidencia y comenzando de nuevo usando \K

Este sitio lo explica bien … http://www.phpfreaks.com/blog/pcre-regex-spotlight-k ..

Pero más o menos cuando tienes una expresión que coincides y quieres recuperar todo detrás de ella, usar \ K lo obligará a comenzar de nuevo …

Ejemplo:

 string = ' with some information 
LOOK FOR ME
'

haciendo coincidir /(\)\K.+?(?=\ hará que la expresión regular se reinicie después de que coincida con la etiqueta div final para que el Regex no incluirá eso en el resultado. El (?=\div) hará que el motor obtenga todo antes de terminar la etiqueta div

Lo que Amber dijo es cierto, pero puedes solucionarlo con otro enfoque: Un grupo de paréntesis que no capturan

 (?<=this\sis\san)(?:\s*)example 

Eso hace que sea una mirada de longitud fija detrás, por lo que debería funcionar.

La mayoría de los motores de expresiones regulares no admiten expresiones de longitud variable para las aserciones de búsqueda hacia atrás.

Puedes usar subexpresiones.

 (this\sis\san\s*?)(example) 

Entonces, para recuperar el grupo 2, “ejemplo”, $2 para regex, o \2 si está usando una cadena de formato (como para el re.sub de re.sub )

    Intereting Posts