str_replace(包stringr)不能替换r中的括号?

时间:2014-04-14 16:32:20

标签: r stringr

我有一个字符串,比如说

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

任何人都有想法为什么会这样?如何删除&#34;()&#34;在字符串中,那么?

3 个答案:

答案 0 :(得分:14)

转义括号是否......

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

您可能还想考虑探索"stringi" package,它具有与“stringr”类似的方法,但具有更灵活的功能。例如,有stri_replace_all_fixed,这在这里很有用,因为您的搜索字符串是固定模式,而不是正则表达式模式:

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

当然,基本gsub处理这个也很好:

gsub("()", "", fruit, fixed=TRUE)
# [1] "goodapple"

答案 1 :(得分:2)

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

cat.speak()

这是因为正则表达式与&#34;(&#34;后跟&#34;)&#34;完全匹配。

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

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

答案 2 :(得分:0)

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

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

[1] "goodapple"  "badapple"   "funnyapple"