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?

Foi útil?

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"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top