regex - online - Expresión regular Lookbehind no funciona con cuantificadores(''+'' o ''*'')
regular expression creator online (5)
Estoy tratando de usar look behinds en una expresión regular y no parece funcionar como esperaba. Entonces, este no es mi uso real, pero para simplificar pondré un ejemplo. Imagina que quiero hacer coincidir "ejemplo" en una cadena que dice "esto es un ejemplo". Por lo tanto, de acuerdo con mi comprensión de la mirada, esto debería funcionar:
(?<=this/sis/san/s*?)example
Lo que esto debería hacer es encontrar "esto es un", luego espaciar los caracteres y finalmente coincidir con la palabra "ejemplo". Ahora, no funciona y no entiendo por qué, ¿es imposible usar ''+'' o ''*'' en el interior de las miradas?
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/
La mayoría de los motores de expresiones regulares no admiten expresiones de longitud variable para mirar detrás de aserciones.
Lo que Amber dijo es cierto, pero puede solucionarlo con otro enfoque: un grupo de paréntesis que no captura.
(?<=this/sis/san)(?:/s*)example
Eso hace que se vea una longitud fija por detrás, por lo que debería funcionar.
Muchas bibliotecas de expresiones regulares solo permiten el uso de expresiones estrictas para mirar detrás de afirmaciones como:
- solo coinciden con cadenas de la misma longitud fija:
(?<=foo|bar|/s,/s)
(tres caracteres cada una) - solo coinciden con cadenas de longitudes fijas:
(?<=foobar|/r/n)
(cada rama con longitud fija) - solo hace coincidir cadenas con una longitud de límite superior:
(?<=/s{,4})
(hasta cuatro repeticiones)
La razón de estas limitaciones es principalmente porque esas bibliotecas no pueden procesar expresiones regulares al revés o solo 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 el llamado comportamiento patológico (consulte también ReDoS ).
Consulte también la sección sobre las limitaciones de las aserciones de look-behind en Regular-Expressions.info .
Oye, si no estás usando la variable python, mira detrás de la afirmación, puedes engañar al motor de expresiones regulares al escapar de la coincidencia y comenzar 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 coincide y quieres obtener todo lo que hay detrás de ella, con / K lo forzará a comenzar de nuevo ...
Ejemplo:
string = ''<a this is a tag> with some information <div this is another tag > LOOK FOR ME </div>''
haciendo coincidir /(/<a).+?(/<div).+?(/>)/K.+?(?=/<div)/
hará que la expresión regular se reinicie después de que coincida con la etiqueta div
final, por lo que regex no incluirá eso en el resultado. El (?=/div)
hará que el motor obtenga todo delante de la etiqueta div final.
Puedes usar sub-expresiones.
(this/sis/san/s*?)(example)
Así que para recuperar el grupo 2, el "ejemplo", $2
para expresiones regulares o /2
si está usando una cadena de formato (como para re.sub
de re.sub
)