regex - sheet - str_detect r
Evite que grep en R trate el "." Como una letra (4)
Tengo un vector de caracteres que contiene texto similar al siguiente:
text <- c("ABc.def.xYz", "ge", "lmo.qrstu")
Me gustaría eliminar todo antes de a .
:
> "xYz" "ge" "qrstu"
Sin embargo, la función grep
parece estar tratando .
como una carta:
pattern <- "([A-Z]|[a-z])+$"
grep(pattern, text, value = T)
> "ABc.def.xYz" "ge" "lmo.qrstu"
El patrón funciona en otro lugar, como en regexpal .
¿Cómo puedo hacer que grep
comporte como se esperaba?
Puede probar la función stringr
paquete stringr
.
str_extract(text, "[^.]*$")
Esto coincidiría con todos los caracteres sin puntos que existen en el último.
Tu patrón funciona, el problema es que grep
hace algo diferente de lo que estás pensando que hace.
Primero usemos su patrón con str_extract_all
del paquete stringr
.
library(stringr)
str_extract_all(text, pattern ="([A-Z]|[a-z])+$")
[[1]]
[1] "xYz"
[[2]]
[1] "ge"
[[3]]
[1] "qrstu"
¡Fíjate que los resultados llegaron como esperabas!
El problema que tienes es que grep
te dará el elemento completo que coincide con tu expresión regular y no solo con la parte coincidente del elemento. Por ejemplo, en el siguiente ejemplo, grep le devolverá el primer elemento porque coincide con "a":
grep(pattern = "a", x = c("abcdef", "bcdf"), value = TRUE)
[1] "abcdef"
grep
es para encontrar el patrón. Devuelve el índice del vector que coincide con un patrón. Si se especifica value=TRUE
, devuelve el valor. A partir de la descripción, parece que desea eliminar una subcadena en lugar de devolver un subconjunto del vector inicial.
Si necesita eliminar la subcadena, puede usar sub
sub(''.*//.'', '''', text)
#[1] "xYz" "ge" "qrstu"
Como primer argumento, hacemos coincidir un patrón, es decir, ''.*//.''
. Coincide con uno o más caracteres ( .*
) Seguido de un punto ( //.
). El //
es necesario para escapar de .
para tratarlo como ese símbolo en lugar de cualquier personaje. Esto coincidirá hasta el último .
personaje en la cadena. Reemplazamos ese patrón coincidente con un ''''
como argumento de reemplazo y, por lo tanto, eliminamos la subcadena.
grep
no hace ningún reemplazo. Busca coincidencias y devuelve los índices (o el valor si especifica valor = T) que dan una coincidencia. Los resultados que obtiene son solo decir que esos cumplen con sus criterios en algún punto de la cadena. Si agregaste algo que no cumple con los criterios en cualquier parte de tu vector de texto (por ejemplo: "9", "# $% 23", ...) entonces no los devolverá cuando hayas llamado a grep.
Si lo desea, solo para devolver la parte coincidente, debe mirar la función de regmatches
. Sin embargo, para sus propósitos, parece que sub
o gsub
deberían hacer lo que quieran.
gsub(".*//.", "", text)
Sugeriría leer la página de ayuda para regexs ?regex
Regex. La página de wikipedia es una lectura decente también, pero tenga en cuenta que las expresiones regulares de R son un poco diferentes a algunos otros. https://en.wikipedia.org/wiki/Regular_expression