2

我正在尝试从字符串中提取方括号之间的内容:

eq <- "(5) h[m] + nadh[m] + q10[m] --> (4) h[c] + nad[m] + q10h2[m]"

我可以过滤掉它们:

gsub("\\[.+?\\]","" ,eq) ##replaces square brackets and everything inside it
   [1] "(5) h + nadh + q10 --> (4) h + nad + q10h2"

但是我怎样才能捕捉到括号内的内容呢?我尝试了以下方法:

gsub("\\[(.+)?\\])", "\\1", eq) 
grep("\\[(.+)?\\]", eq, value=TRUE)

但两者都返回给我整个字符串:

[1] "(5) h[m] + nadh[m] + q10[m] --> (4) h[c] + nad[m] + q10h2[m]"

此外,在我的应用程序中,我永远不知道方括号中有多少这样的术语,所以我不知道 gsub 中的“替换”参数应该是什么样子(例如\\1\\1_\\2)。提前致谢!

4

3 回答 3

9

试试这个:

eq <- "(5) h[m] + nadh[m] + q10[m] --> (4) h[c] + nad[m] + q10h2[m]"
pattern<-"\\[.+?\\]"
m <- gregexpr(pattern, eq)
regmatches(eq, m)
[[1]]
[1] "[m]" "[m]" "[m]" "[c]" "[m]" "[m]"

您的第一个模式不起作用,因为从未找到一个额外的括号:

gsub("\\[(.+)?\\])", "\\1", eq) # Yours 
gsub("\\[(.+?)\\]", "\\1", eq) # Corrected -- kind of
[1] "(5) hm + nadhm + q10m --> (4) hc + nadm + q10h2m"

您本质上正在做的是用您的第一个括号部分替换匹配的每个实例,这不是您想要的。

您的第二个模式 usinggrep只是在字符串中搜索该模式,找到它,然后返回所有具有该模式的字符串,这是您的一个字符串。

于 2013-04-03T12:57:16.690 回答
7

另外一个选项 :

library(stringr)
pattern<-"\\[.+?\\]"
str_extract_all(eq,pattern)
[[1]]
[1] "[m]" "[m]" "[m]" "[c]" "[m]" "[m]"
于 2013-04-03T13:14:00.463 回答
3

gsub 用替换字符串替换字符串的一部分,但在这里我们希望提取字符串而不是替换它们。

gsubfn strapplyc包中的strapplyc可以做到这一点。使用您的模式,但在您希望捕获的部分周围插入括号(如果您希望捕获包括方括号在内的整个模式,则省略括号):

> library(gsubfn)
> strapplyc(eq, "\\[(.*?)\\]")[[1]]
[1] "m" "m" "m" "c" "m" "m"

的胆量strapplyc是用 tcl 编写的,所以它非常快,尽管对于像这里的那些小字符串来说,速度并不重要。

strapply还存在strapply接受第三个参数,即应用于每个提取的捕获的函数、列表或原型对象。例如

> # function
> strapply(eq, "\\[(.*?)\\]", toupper)[[1]]
[1] "M" "M" "M" "C" "M" "M"

> # list
> strapply(eq, "\\[(.*?)\\]", list(c = "crunchy", m = "munchy"))[[1]]
[1] "munchy"  "munchy"  "munchy"  "crunchy" "munchy"  "munchy" 
于 2013-04-03T13:19:27.597 回答