IIC2233 / syllabus-2020-2

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉🎊
https://iic2233.github.io
7 stars 57 forks source link

Cómo hacer una regex que capture un string determinado solamente si *no* contiene un patrón #1291

Closed daniela-carreno closed 3 years ago

daniela-carreno commented 3 years ago

Prerrequisitos

Duda

Hola. He estado tratando de construir una regex tal que, por ejemplo, no contenga un patrón del tipo == sección ==. Con el contenido entregado en el anexo de expresiones regulares no me queda del todo claro cómo puedo no capturar determinado patrón. Estuve googleando y lo único que encontré fueron los "negative look-arounds" ( https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word ), el problema fue que, al utilizar dicho constructo con pyrematch (al usarlo dentro de una variable), me generaba un error del tipo trailing unparsed. ¿Cómo podría hacer lo pedido?

nicovsj commented 3 years ago

@daniela-carreno,

No puedo decirte como hacerlo, pues eso es parte de la dificultad de la tarea. Por otro lado, pyrematch no tiene implementado los negative look-arounds, de ahí que te aparezca ese error.

Lo que sí te puede dar una idea es que el patrón [^a] sirve para hacer match con cualquier cosa que no sea una a.

Suerte!

daniela-carreno commented 3 years ago

El problema es que quiero descartar strings específicos, no caracteres individuales, que es lo que hace el patrón que mencionas. Ese me sirvió para implementar ciertas consultas, pero a la hora de decirle a mi regex que no quiero que capture secuencias que contengan determinados strings, no logro encontrar la forma de hacerlo, al menos no sin utilizar negative look-arounds.

Saludos!

amahns1 commented 3 years ago

Me sumo a la pregunta. Creo que hay una forma de hacer match con un caracter al menos n veces [a{3,}], pero no funciona. Hasta ahora lo que he hecho es !content{[^={3,}]*}, pero esto toma todos los strings posibles de al menos largo 3 que no contengan un =. Lo ideal sería poder hacer match con cualquier string que no contenga n simbolos seguidos o que no contenga un string en específico.

Muchos saludos.

nicovsj commented 3 years ago

Lo que les puedo decir es que no les conviene intentar hacer un regex que NO haga match con un string en específico. Como mencioné antes, negative lookhead no es algo que está soportado en pyrematch. Sin embargo sí se puede escribir regexes "crudos" que hacen match con cualquier cosa excepto un string, pero el problema es que se vuelve complicado hacerlo. Por ejemplo un patrón que NO hace match con hola (pero sí con cualquier otro string no vacío) es ([^h]|h[^o]|ho[^l]|hol[^a]).*.

En la solución que pensamos, las consultas no necesitan de este tipo de patrones. Por lo que les recomiendo pensar en otra forma de hacerlo.

Saludos!

amahns1 commented 3 years ago

Me surgió una duda general de la actividad. ¿Se pueden separar casos en las consultas? ¿O solamente se puede obtener la información directamente a partir de la expresión de regex?