str_replace (строка пакета) не может заменить скобки в r?

У меня есть строка, скажем

 fruit <- "()goodapple"

Я хочу удалить скобки в строке. Я решил использовать пакет stringr, потому что он обычно может справиться с такими проблемами. Я использую :

str_replace(fruit,"()","")

Но ничего не заменяется, а заменяется следующее:

[1] "()good"

Если я хочу заменить только правую половину кронштейна, это работает:

str_replace(fruit,")","") 
[1] "(good"

Однако левая полускобка не работает:

str_replace(fruit,"(","")

и отображается следующая ошибка:

Error in sub("(", "", "()good", fixed = FALSE, ignore.case = FALSE, perl = FALSE) : 
 invalid regular expression '(', reason 'Missing ')''

У кого-нибудь есть идеи, почему это происходит? Как тогда удалить "()" в строке?


person nan    schedule 14.04.2014    source источник


Ответы (3)


Экранирование скобок делает это...

str_replace(fruit,"\\(\\)","")
# [1] "goodapple"

Вы также можете изучить пакет "stringi", который имеет аналогичный подход к "stringr", но имеет более гибкие функции. Например, есть stri_replace_all_fixed, который был бы полезен здесь, поскольку ваша строка поиска является фиксированным шаблоном, а не шаблоном регулярного выражения:

library(stringi)
stri_replace_all_fixed(fruit, "()", "")
# [1] "goodapple"

Конечно, базовый gsub тоже прекрасно справляется с этим:

gsub("()", "", fruit, fixed=TRUE)
# [1] "goodapple"
person A5C1D2H2I1M1N2O1R2T1    schedule 14.04.2014

Принятый ответ работает для вашей конкретной проблемы, но не для более общей проблемы:

my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace(my_fruits,"\\(\\)","")
## "goodapple"  "(bad)apple", "(funnyapple"

Это связано с тем, что регулярное выражение точно соответствует «(», за которым следует «)».

Предполагая, что вы заботитесь только о парах скобок, это более сильное решение:

str_replace(my_fruits, "\\([^()]{0,}\\)", "")
## "goodapple"   "apple"       "(funnyapple"
person Charlie Joey Hadley    schedule 27.07.2017

Основываясь на ответе MJH, это удаляет все ( или ):

my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace_all(my_fruits, "[//(//)]", "")

[1] "goodapple"  "badapple"   "funnyapple"
person Robin    schedule 04.12.2018