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.

Cómo eliminar todas las palabras antes de una palabra usando regex en R?

Me gustaría eliminar las palabras antes de ‘not’. Cuando intento el fragmento de código a continuación, no obtengo el resultado esperado.

test <- c("this will not work.", "' is not one of ['A', 'B', 'C'].", "This one does not use period ending!")
gsub(".*(not .*)\\.", "\\1", test)

Pero si reemplazo \ con [[:punct:]], funciona bien. ¿Alguien puede decirme por qué el primero no está funcionando? Es posible que necesite mantener otros signos de puntuación, aparte del punto.

Salida esperada:

> not work
> not one of ['A', 'B', 'C']
> not use period ending!

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el primer fragmento de código no funciona como se espera es porque \\. en la expresión regular solo coincide con el caracter de punto “.”. Sin embargo, en la cadena de prueba, hay otros signos de puntuación como coma “,” y signo de exclamación “!” que vienen antes del término “not”. Por lo tanto, la expresión regular ".*(not .*)\\." no puede capturar esas puntuaciones que vienen antes de “not”.

    Cuando \\. se sustituye por [[:punct:]], la expresión regular coincide con cualquier signo de puntuación (no solo el punto) que viene antes de “not”. Esto se debe a que [[:punct:]] es una clase de caracteres que coincide con cualquier caracter de puntuación.

    Por lo tanto, para eliminar cualquier palabra antes de “not” manteniendo otras puntuaciones, podemos modificar la expresión regular de la siguiente manera:

    “`{r}
    test <- c(“esto no funcionará.”, “” no es uno de [‘A’, ‘B’, ‘C’].”, “¡Este no usa punto al final!”)
    gsub(“.([Nn]ot .)”, “\1”, test)


    Esta expresión regular `".*([Nn]ot .*)"` coincide con cualquier palabra (es decir, caracteres) antes de la palabra "not" (ignorando mayúsculas y minúsculas), seguido de cualquier otro caracter después de "not". Los paréntesis `()` alrededor de `[Nn]ot .*` capturan esta parte de la cadena que queremos mantener, y `\\1` reemplaza la cadena completa con la subcadena capturada. La salida del código anterior sería:

    [1] “not work.” “‘ is not one of [‘A’, ‘B’, ‘C’].” “not use period ending!”


    Ten en cuenta que en la segunda cadena, la salida contiene una comilla simple antes de "is not", lo cual no estaba presente en la salida esperada. Si deseas eliminar las comillas simples además de las palabras antes de "not", puedes modificar la expresión regular de la siguiente manera: ```{r} gsub(".*\\'(.*)\\'", "\\1", gsub(".*([Nn]ot .*)", "\\1", test))

    Esto primero elimina las comillas simples usando la expresión regular ".*\\'(.*)\\'", luego elimina las palabras antes de “not” usando la expresión regular anterior. La salida sería:

    [1] "work."           "is not one of A, B, C." "use period ending!"
    

Comments are closed.