删除R中字符串和括号之间的所有字符

remove all characters between string and bracket in R

假设我有一个数据框 df,其中 df$strings 列包含

这样的字符串
[cat 00.04;09]
[cat 00.04;10]

等等。我想删除 "[cat" 和 "]" 之间的所有字符以产生

[cat]
[cat]

我已经尝试使用 gsub 进行此操作,但它不起作用,我不确定我做错了什么:

gsub('cat*?\]', '', df)

请注意,cat*?\] patten 匹配 ca,然后是任何 0+ t 个字符,但尽可能少,然后是 ].

您想在 [cat] 之间匹配 ] 以外的任何字符:

gsub('\[cat[^]]*\]', '[cat]', df$strings)

这里,

  • \[ - 匹配 [
  • cat - 匹配 cat
  • [^]]* - ] 以外的 0+ 个字符(请注意,括号表达式内的 ] 放在开头时不应转义 - 否则,如果你转义它,您将需要添加 perl=TRUE 参数,因为 PCRE 正则表达式引擎可以处理括号表达式内的正则表达式转义(不是默认的 TRE))
  • \] - a ](你甚至不需要转义它,你可以只使用 ])。

参见 R demo:

x <- c("[cat 00.04;09]", "[cat 00.04;10]")
gsub('\[cat[^]]*\]', '[cat]', x)
## => [1] "[cat]" "[cat]"

如果cat可以是任何单词,使用

gsub('\[(\w+)[^]]*\]', '[\1]', x)

其中 (\w+) 是 ID=1 的捕获组,匹配 1 个或多个字符,替换模式中的 \1 是代表组值的替换反向引用。