IIC2233 / syllabus-2021-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🚀✨
https://iic2233.github.io
38 stars 49 forks source link

[RegEx] + vs * #850

Closed fernandosmither closed 3 years ago

fernandosmither commented 3 years ago

Por qué en este ejemplo los operadores + y * traen resultados distintos?

image

image

aaossa commented 3 years ago

Hola @fernandosmither , recuerda que ^ marca el inicio de un string y que * y + son cuantificadores. Mi primera impresión fue que tu regex no está bien definida, porque lo que dices en el primer caso es "busca el inicio del string y después algo (?) que esté 1 o más veces justo antes del final" y en la otra dices "busca el inicio del string y después algo (?) que esté 0 o más veces justo antes del final".

Dándole otra vuelta, creo que lo que ocurre es que para Python ese "algo (?)" es justamente el inicio del string:

  1. "Busca que el inicio del string esté 1 o más veces justo antes del final": Esto solo es posible si el string tiene largo 0. Probé ese caso y justamente lo marca como match, así que vamos bien 👌
  2. "Busca que el inicio del string esté 0 o más veces justo antes del final": Como Python puede ver todos los casos como si el inicio del string estuviera 0 veces justo antes del final, esta expresión se reduce a "es un match si es que el string tiene final", o sea todos los strings posibles.

Espero se entienda 😅

fernandosmither commented 3 years ago

Hola @fernandosmither , recuerda que ^ marca el inicio de un string y que * y + son cuantificadores. Mi primera impresión fue que tu regex no está bien definida, porque lo que dices en el primer caso es "busca el inicio del string y después algo (?) que esté 1 o más veces justo antes del final" y en la otra dices "busca el inicio del string y después algo (?) que esté 0 o más veces justo antes del final".

Dándole otra vuelta, creo que lo que ocurre es que para Python ese "algo (?)" es justamente el inicio del string:

  1. "Busca que el inicio del string esté 1 o más veces justo antes del final": Esto solo es posible si el string tiene largo 0. Probé ese caso y justamente lo marca como match, así que vamos bien 👌
  2. "Busca que el inicio del string esté 0 o más veces justo antes del final": Como Python puede ver todos los casos como si el inicio del string estuviera 0 veces justo antes del final, esta expresión se reduce a "es un match si es que el string tiene final", o sea todos los strings posibles.

Espero se entienda 😅

Me hace todo el sentido del mundo, muchas gracias!

Una duda emergente, cómo probó que un string vacío le diese match? no se vería un output vacío, al igual que cuando no se encontró nada?

aaossa commented 3 years ago

Usé tu mismo código (cambié el primer elemento en la lista por un string vacío), entonces se imprimió cumple con el patrón. Esto significa que el patrón sí encontró algo, solo que "coincidió" con que s era vacío.

fernandosmither commented 3 years ago

Usé tu mismo código (cambié el primer elemento en la lista por un string vacío), entonces se imprimió cumple con el patrón. Esto significa que el patrón sí encontró algo, solo que "coincidió" con que s era vacío.

Toda la razón, Gracias! 😄