12

我有一个字符串,说

 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 ')''

任何人都知道为什么会发生这种情况?那么如何删除字符串中的“()”呢?

4

3 回答 3

23

转义括号是否...

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"
于 2014-04-14T16:34:44.070 回答
3

接受的答案适用于您的确切问题,但不适用于更普遍的问题:

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

这是因为正则表达式完全匹配“(”后跟“)”。

假设您只关心括号对,这是一个更强大的解决方案:

str_replace(my_fruits, "\\([^()]{0,}\\)", "")
## "goodapple"   "apple"       "(funnyapple"
于 2017-07-27T10:56:15.047 回答
1

基于 MJH 的回答,这将删除所有(或):

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

[1] "goodapple"  "badapple"   "funnyapple"
于 2018-12-04T22:57:02.253 回答