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!
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)
[1] “not work.” “‘ is not one of [‘A’, ‘B’, ‘C’].” “not use period ending!”
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: