str_detect sheet regulares regular punct expresiones examples cheat regex r grep character

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