str_extract sheet regular pattern cheat regex r capitalization

regex - sheet - stringr r



R: Capitalizar todo después de un cierto personaje (3)

Me gustaría capitalizar todo en un vector de caracteres que viene después de la primera _ . Por ejemplo el siguiente vector:

x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f")

Debería salir así:

"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

He intentado jugar con expresiones regulares , pero no puedo hacer esto. Cualquier sugerencia sera apreciada.


Ejemplo simple usando base::strsplit

x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f", "a") myCap <- function(x) { out <- sapply(x, function(y) { temp <- unlist(strsplit(y, "_")) out <- temp[1] if (length(temp[-1])) { out <- paste(temp[1], paste(toupper(temp[-1]), collapse="_"), sep="_") } return(out) }) out } > myCap(x) NYC_23df BOS_3_rb mgh_3_3_f a "NYC_23DF" "BOS_3_RB" "mgh_3_3_F" "a"

Ejemplo usando el paquete stringr

pkg <- "stringr" if (!require(pkg, character.only=TRUE)) { install.packages(pkg) require(pkg, character.only=TRUE) } myCap.2 <- function(x) { out <- sapply(x, function(y) { idx <- str_locate(y, "_") if (!all(is.na(idx[1,]))) { str_sub(y, idx[,1], nchar(y)) <- toupper(str_sub(y, idx[,1], nchar(y))) } return(y) }) out } > myCap.2(x) NYC_23df BOS_3_rb mgh_3_3_f a "NYC_23DF" "BOS_3_RB" "mgh_3_3_F" "a"


Estuviste muy cerca:

gsub("(_.*)","//U//1",x,perl=TRUE)

parece funcionar. Solo necesitaba usar _.* (Guión bajo seguido de cero o más caracteres) en lugar de _* (cero o más guiones bajos) ...

Para desarmar esto un poco más:

  • _.* proporciona un patrón de expresión regular que coincide con un guión bajo _ seguido de cualquier número (incluido 0) de caracteres adicionales; . denota "cualquier carácter" y * denota "cero o más repeticiones del elemento anterior"
  • rodeando esta expresión regular con paréntesis () denota que es un patrón que queremos almacenar
  • //1 en la cadena de reemplazo dice "inserta el contenido del primer patrón coincidente", es decir, lo que sea _.*
  • //U , junto con perl=TRUE , dice "poner lo que sigue en mayúsculas" (mayúsculas _ no tiene ningún efecto; si quisiéramos capitalizar todo después de (por ejemplo) una g minúscula, tendríamos que excluir la g a partir del patrón almacenado e incluirlo en el patrón de reemplazo: gsub("g(.*)","g//U//1",x,perl=TRUE) )

Para más detalles, busque "reemplazo" y "capitalizando" en ?gsub (y ?regexp para obtener información general sobre expresiones regulares)


gsubfn en el paquete gsubfn es como gsub excepto que la cadena de reemplazo puede ser una función. Aquí coincidimos _ y todo después alimentamos el partido a través de toupper :

> library(gsubfn) > > gsubfn("_.*", toupper, x) [1] "NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

Tenga en cuenta que este enfoque implica una expresión regular particularmente simple.