str_replace (paquet stringr) ne peut pas remplacer les parenthèses dans les r?
Question
J'ai une chaîne de caractères, dire
fruit <- "()goodapple"
Je veux supprimer les crochets dans la chaîne.Je décide d'utiliser stringr colis, car il peut généralement gérer ce genre de problèmes.J'utilise :
str_replace(fruit,"()","")
Mais rien n'est remplacé, et celle-ci est remplacée:
[1] "()good"
Si je ne veux remplacer la moitié droite du support, il fonctionne:
str_replace(fruit,")","")
[1] "(good"
Cependant, la moitié gauche du support ne fonctionne pas:
str_replace(fruit,"(","")
et le message d'erreur suivant s'affiche:
Error in sub("(", "", "()good", fixed = FALSE, ignore.case = FALSE, perl = FALSE) :
invalid regular expression '(', reason 'Missing ')''
Quelqu'un a des idées de pourquoi cela se produit?Comment puis-je supprimer les "()" dans la chaîne, alors?
La solution
Fuyant les parenthèses t-il...
str_replace(fruit,"\\(\\)","")
# [1] "goodapple"
Vous pouvez également envisager d'explorer l' "stringi" package, qui a une approche similaire à "stringr" mais il a plus de fonctions flexibles.Par exemple, il y a stri_replace_all_fixed
, ce qui serait utile ici depuis votre chaîne de recherche est un motif fixe, pas d'une expression régulière pattern:
library(stringi)
stri_replace_all_fixed(fruit, "()", "")
# [1] "goodapple"
Bien sûr, de base gsub
les poignées de ce juste trop belle:
gsub("()", "", fruit, fixed=TRUE)
# [1] "goodapple"
Autres conseils
La réponse acceptée fonctionne pour votre problème exact, mais pas pour le problème plus général:
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace(my_fruits,"\\(\\)","")
## "goodapple" "(bad)apple", "(funnyapple"
C'est parce que la regex correspond exactement à un "(suivi d'un") ".
En supposant que vous vous souciez uniquement de paires de support, c'est une solution plus forte:
str_replace(my_fruits, "\\([^()]{0,}\\)", "")
## "goodapple" "apple" "(funnyapple"
Bâtiment de la réponse de MJH, cela supprime tout (ou):
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace_all(my_fruits, "[//(//)]", "")
[1] "goodapple" "badapple" "funnyapple"