str_replace (pacote stringr) não pode substituir colchetes em r?
Pergunta
Eu tenho uma corda, digamos
fruit <- "()goodapple"
Quero remover os colchetes da string.Eu decido usar o pacote stringr porque ele geralmente pode lidar com esse tipo de problema.Eu uso :
str_replace(fruit,"()","")
Mas nada é substituído e o seguinte é substituído:
[1] "()good"
Se eu quiser apenas substituir o meio colchete direito, funciona:
str_replace(fruit,")","")
[1] "(good"
No entanto, o meio colchete esquerdo não funciona:
str_replace(fruit,"(","")
e o seguinte erro é mostrado:
Error in sub("(", "", "()good", fixed = FALSE, ignore.case = FALSE, perl = FALSE) :
invalid regular expression '(', reason 'Missing ')''
Alguém tem idéia de por que isso acontece?Como posso remover o "()" da string, então?
Solução
Escapar dos parênteses faz isso ...
str_replace(fruit,"\\(\\)","")
# [1] "goodapple"
Você também pode considerar explorar o pacote "stringi", que tem uma abordagem semelhante a "stringr", mas possui funções mais flexíveis.Por exemplo, há stri_replace_all_fixed
, o que seria útil aqui, já que sua string de pesquisa é um padrão fixo, não um padrão regex:
library(stringi)
stri_replace_all_fixed(fruit, "()", "")
# [1] "goodapple"
Claro, básico gsub
lida com isso muito bem também:
gsub("()", "", fruit, fixed=TRUE)
# [1] "goodapple"
Outras dicas
A resposta aceita funciona exatamente para o seu problema, mas não para o problema mais geral:
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace(my_fruits,"\\(\\)","")
## "goodapple" "(bad)apple", "(funnyapple"
Isso ocorre porque a regex corresponde exatamente a um "(" seguido por um ")".
Supondo que você se preocupa apenas com pares de colchetes, esta é uma solução mais forte:
str_replace(my_fruits, "\\([^()]{0,}\\)", "")
## "goodapple" "apple" "(funnyapple"
Com base na resposta de MJH, isso remove todos (ou):
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace_all(my_fruits, "[//(//)]", "")
[1] "goodapple" "badapple" "funnyapple"