Capítulo 4 Expresiones regulares

Son secuencias de caracteres que forman un patrón de búsqueda.

  • Cuantificadores
    • ? El caracter que precede puede aparecer como mucho una vez
    • + El carácter que le precede debe aparecer al menos una vez
    • * El carácter que le precede puede aparecer cero, una o más veces
    • {} Las llaves juegan el papel de meta caracteres, para que cumplan su funcionalidad deben estar despues de la expresión regular y encierren uno o varios números
    • {n} Indica que coincide n veces
    • {n,} Indica que coincide n o más veces
    • {,n} Indica que coincide hasta n veces
    • {n,m} Indica que coincide mas de n veces y menos de m veces
  • Alternación
    • $ Representa el final de la cadena de caracteres o el final de la línea
    • ^ Representa el inicio de la cadena
  • Agrupación
    • () Son usados para la aplicación de operadores sobre más de un caracter
    • [] Agrupan caracteres en grupos o clases
    • [a-z] Especifica un rango de caracteres
    • [^…. ] Lista de caracteres excluidos
    • Separa las alternativas
    • . Busca cualquier carácter sin incluir los saltos de línea
  • Agrupaciones definidas
    • [:alnum:] Caracteres alfanuméricos
    • [:alpha:] Caracteres
    • [:blank:] Caracteres blancos
    • [:digit:] Dígitos
    • [:lower:] Todas las letras minúsculas
    • [:upper:] Todas las letras mayúsculas
    • [:punct:] Caracteres de puntuación
  • Barra invertida
    • \d Dígito del 0 al 9
    • \w Cualquier carácter alfanumérico
    • \s Un espacio en blanco
    • \D Cualquier carácter que no sea un dígito del 0 al 9
    • \W Cualquier carácter no alfanumérico
    • \S Cualquier carácter que no sea un espacio en blanco

El paquete stringr, entre otros, permite el uso de expresiones regulares

library(stringr)
frutas <- c("arándano", "plátano", "pera", "sandía", "melón", "fresa")
str_view(frutas, "^a", html=T) # empiece con "a"
str_view(frutas, "o$", html=T) # termine con "o"
str_view(frutas, "e+", html=T) # contenga "e" al menos una vez
postres <- c("pie de manzana", "manzana", "queque de manzana", "pie de piña", 
             "queque de naranja", "queque de piña")
str_view(postres, "manzana", html=T)
str_view(postres, "manzana|piña", html=T)
patron <- "(manzana|piña)"
grep(pattern=patron, postres) # obtiene la posición de elementos que cumplen el patrón
## [1] 1 2 3 4 6
grep(pattern=patron, postres, value=T) # obtiene la lista que cumple el patrón
## [1] "pie de manzana"    "manzana"           "queque de manzana"
## [4] "pie de piña"       "queque de piña"
patron <- "pie"
grep(pattern=patron, postres)
## [1] 1 4
grep(pattern=patron, postres, invert=T, value= T)
## [1] "manzana"           "queque de manzana" "queque de naranja"
## [4] "queque de piña"
postres_no_pie <- postres[-grep(pattern=patron, postres)]
postres_no_pie
## [1] "manzana"           "queque de manzana" "queque de naranja"
## [4] "queque de piña"

4.1 Pre-procesamiento

También pueden utilizarse las expresiones regulares para realizar pre-procesamiento de los datos.

Por ejemplo, en el siguiente vector, se han introducido valores de dinero, pero considerando la , como separador de miles. De no existir estos caracteres, bastaría con ejecutar el comando as.numeric para convertir el vector de tipo texto a tipo numérico.

money <- c("1,000,000", "2,000,000", "300,000.30", "40,000", "5,000.05")
as.numeric(money)
## Warning: NAs introducidos por coerción
## [1] NA NA NA NA NA

Con ayuda de las expresiones regulares buscaresmos las , y las eliminaremos.

money <- gsub(",", "", money)
as.numeric(money)
## [1] 1000000.00 2000000.00  300000.30   40000.00    5000.05

También, podemos emplear gsub para eliminar caracteres y espacios vacíos en el nombre de las columnas. Por ejemplo

df <- datasets::iris3
colnames(df)
## [1] "Sepal L." "Sepal W." "Petal L." "Petal W."
colnames(df) <- gsub(" ", "_", colnames(df))
colnames(df)
## [1] "Sepal_L." "Sepal_W." "Petal_L." "Petal_W."

Por supuesto, también podemos eliminar el .

colnames(df) <- gsub("\\.", "", colnames(df))
colnames(df)
## [1] "Sepal_L" "Sepal_W" "Petal_L" "Petal_W"