str_replace (pacchetto stringr) non può sostituire le staffe in r?
Domanda
Ho una stringa, dì
fruit <- "()goodapple"
.
Voglio rimuovere le staffe nella stringa.Decido di utilizzare il pacchetto Stringr perché di solito può gestire questo tipo di problemi.Io uso:
str_replace(fruit,"()","")
.
Ma nulla viene sostituito, e il seguente è sostituito:
[1] "()good"
.
Se voglio solo sostituire la mezza staffa destra, funziona:
str_replace(fruit,")","")
[1] "(good"
.
Tuttavia, la durata mezza sinistra non funziona:
str_replace(fruit,"(","")
.
E viene visualizzato il seguente errore:
Error in sub("(", "", "()good", fixed = FALSE, ignore.case = FALSE, perl = FALSE) :
invalid regular expression '(', reason 'Missing ')''
.
Qualcuno ha idee perché questo accade?Come posso rimuovere il "()" nella stringa, allora?
Soluzione
Escaping Le parentesi lo fa ...
str_replace(fruit,"\\(\\)","")
# [1] "goodapple"
.
.
Si può anche desiderare di prendere in considerazione l'esplorazione del "stringi" pacchetto , che ha un approccio simile a "stringr" ma ha funzioni più flessibili.Ad esempio, c'è stri_replace_all_fixed
, che sarebbe utile qui poiché la tua stringa di ricerca è un modello fisso, non un motivo regex:
library(stringi)
stri_replace_all_fixed(fruit, "()", "")
# [1] "goodapple"
.
.
Certo, gsub
di base Gestisci anche questo bene:
gsub("()", "", fruit, fixed=TRUE)
# [1] "goodapple"
. Altri suggerimenti
La risposta accettata funziona per il tuo problema esatto, ma non per il problema più generale:
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace(my_fruits,"\\(\\)","")
## "goodapple" "(bad)apple", "(funnyapple"
.
Questo perché il regex corrisponde esattamente a "(" seguito da A ")".
Supponendo che ti importa solo sulle coppie della staffa, questa è una soluzione più forte:
str_replace(my_fruits, "\\([^()]{0,}\\)", "")
## "goodapple" "apple" "(funnyapple"
. Costruire la risposta di MJH, questo rimuove tutto (o):
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace_all(my_fruits, "[//(//)]", "")
[1] "goodapple" "badapple" "funnyapple"
.