str_replace (пакет stringr) не может заменить скобки в 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 ')''
У кого-нибудь есть идеи, почему это происходит?Как тогда удалить «()» в строке?
Решение
Выход из круглых скобок делает это...
str_replace(fruit,"\\(\\)","")
# [1] "goodapple"
Вы также можете рассмотреть возможность изучения пакет «стринги», который имеет аналогичный подход к «stringr», но имеет более гибкие функции.Например, есть stri_replace_all_fixed
, что было бы полезно здесь, поскольку ваша строка поиска представляет собой фиксированный шаблон, а не шаблон регулярного выражения:
library(stringi)
stri_replace_all_fixed(fruit, "()", "")
# [1] "goodapple"
Конечно, базовый gsub
прекрасно справляется и с этим:
gsub("()", "", fruit, fixed=TRUE)
# [1] "goodapple"
Другие советы
Принятый ответ работает для вашей точной проблемы, но не для более общей проблемы:
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace(my_fruits,"\\(\\)","")
## "goodapple" "(bad)apple", "(funnyapple"
.
Это потому, что регулярное выражение точно совпадает с «(« с последующим «)».
Предполагая, что вы заботитесь только о парах кронштейна, это более сильное решение:
str_replace(my_fruits, "\\([^()]{0,}\\)", "")
## "goodapple" "apple" "(funnyapple"
. Создание ответа MJH, это удаляет все (или):
my_fruits <- c("()goodapple", "(bad)apple", "(funnyapple")
str_replace_all(my_fruits, "[//(//)]", "")
[1] "goodapple" "badapple" "funnyapple"
.