从字符字符串中删除括号

49

我正在尝试从R字符串中删除一个括号,并遇到以下错误:

string <- "log(M)"
gsub("log", "", string) # Works just fine
gsub("log(", "", string) #breaks
# Error in gsub("log(", "", test) : 
#   invalid regular expression 'log(', reason 'Missing ')''
3个回答

75

28

Ben的答案提供了通常适用的好方法。

或者,根据您的情况,您可以使用fixed=TRUE参数,像这样:

gsub("log(", "", string, fixed=TRUE)
# [1] "M)"

gsub()pattern参数是包含你要搜索的字符序列的字符串时,这种方法是合适的。这样做的好处是可以直接输入你要搜索的精确模式,而无需进行转义等处理。


3
@BenBolker -- 奇怪。应该是fixed=TRUE,但 fixed="TRUE"fixed="true"fixed="True" 也都可以工作。其他的组合,如 fixed="TRue"fixed="TruE" 不行。相关地(?)我最近意识到 rnorm("9") (例如)也可以工作,尽管我认为它不应该能工作。(顺便说一下,rnorm("9", "1") 不能 工作。)我想知道这些情况是否与底层 C 代码处理传递给它的参数的方式有关。你怎么看? - Josh O'Brien
1
有趣。答案在?as.logical 中:'as.logical' 试图将其参数强制转换为逻辑类型。对于 'factor',这使用 'levels'(标签)。与 'as.vector' 一样,它会剥离属性,包括名称。 字符串 'c(“T”,“TRUE”,“True”,“true”)' 被视为 true,'c(“F”,“FALSE”,“False”,“false”)' 被视为 false,所有其他情况均为 'NA'。 - Ben Bolker
@BenBolker 不错的发现。我想知道 rnorm("9") 情况下是否存在某种相关/类似的转换,以及它是否仅在第一个参数中发生,因为它是没有默认值的参数。刚刚检查了 seq_len("9")(因为它是我想到的第一个 .Primitive 函数),它显示出了类似的行为... - Josh O'Brien

1

如果你不是一个正则表达式专家(我们中的很多人都不是!),我认为更直接的方法是将移除不需要的文本和括号分开,前提是你的查询支持它。

问题似乎只想要移除括号,所以你可以使用:

gsub(paste(c("[(]", "[)]"), collapse = "|"), "", string)

这将导致没有括号的字符串:"logM"
如果你还想删除"M"
gsub(paste(c("M", "[(]", "[)]"), collapse = "|"), "", string)

这将导致结果为“log”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接