es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué es esta la salida de la función sub() en R?

Tengo el siguiente vector y código (en negrita) proporcionado por un ejercicio del curso de R de DataCamp.

awards <- c("Ganó 1 Oscar.",
  "Ganó 1 Oscar. Otros 9 premios y 24 nominaciones.",
  "1 premio y 2 nominaciones.",
  "2 premios y 3 nominaciones.",
  "Nominado a 2 Globos de Oro. 1 premio más y 2 nominaciones.",
  "4 premios y 1 nominación.")

sub("\\.\\em>\\ \\s([0-9]+)\\ \\snominación.\\em>$", "\\ \\1", awards)

<h1>Resultado:</h1>

[1] "Ganó 1 Oscar." "24"             "2"              "3"              "2"
[6] "1"

Entiendo que el código ha reemplazado el número de nominaciones por toda la frase. No entiendo lo siguiente:

  • Cómo \\1 corresponde a cada número (parece que solo debería reemplazarse por el número 1)?
  • Por qué también se reemplaza la primera parte de la frase (por ejemplo, “4 premios y…”) cuando parece que debería ser todo después del espacio antes de las nominaciones.
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El \\1 en la cadena de sustitución corresponde al primer grupo de captura en la expresión regular, que es ([0-9]+). Este grupo coincide con uno o más dígitos que aparecen justo antes de la palabra “nomination”. Por lo tanto, cuando la expresión regular encuentra una coincidencia en una cadena, captura el número de nominaciones y lo guarda en el primer grupo de captura. El \\1 en la cadena de sustitución reemplaza entonces toda la cadena coincidente con el contenido del primer grupo de captura, que es el número de nominaciones.

    En cuanto a la segunda pregunta, la expresión regular .*\ \s([0-9]+)\ \snomination.*$ coincide con cualquier secuencia de caracteres (.*) seguida de un espacio (\), un carácter de espacio en blanco (\s), uno o más dígitos ([0-9]+), otro espacio, la palabra “nomination” y luego cualquier otro carácter hasta el final de la cadena (.*$). Esto significa que la expresión regular coincide con toda la cadena, pero solo captura el número de nominaciones. Por lo tanto, cuando se realiza la sustitución utilizando el grupo capturado, toda la cadena se reemplaza solo por el número de nominaciones.

Comments are closed.