Regex R:gsub和捕获

Regex R:gsub和捕获,regex,string,r,gsub,regex-greedy,Regex,String,R,Gsub,Regex Greedy,我试图从字符串中提取方括号之间的内容: eq <- "(5) h[m] + nadh[m] + q10[m] --> (4) h[c] + nad[m] + q10h2[m]" 但是我怎样才能捕捉到括号内的内容呢?我尝试了以下方法: gsub("\\[(.+)?\\])", "\\1", eq) grep("\\[(.+)?\\]", eq, value=TRUE) 但两者都返回整个字符串: [1] "(5) h[m] + nadh[m] + q10[m] --> (4)

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

eq <- "(5) h[m] + nadh[m] + q10[m] --> (4) h[c] + nad[m] + q10h2[m]"
但是我怎样才能捕捉到括号内的内容呢?我尝试了以下方法:

gsub("\\[(.+)?\\])", "\\1", eq) 
grep("\\[(.+)?\\]", eq, value=TRUE)
但两者都返回整个字符串:

[1] "(5) h[m] + nadh[m] + q10[m] --> (4) h[c] + nad[m] + q10h2[m]"
此外,在我的应用程序中,我不知道方括号中出现了多少这样的术语,因此我不知道gsub中的“replace”参数应该是什么样子(例如
\\1
\\1\\2
)。 提前谢谢

试试这个:

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]"
基本上,您所做的是用第一个括号中的部分替换匹配的每个实例,这不是您想要的

您的第二个模式使用
grep
,只需在字符串中搜索该模式,找到它,然后返回所有具有该模式的字符串,即您的一个字符串。

另一个选项:

library(stringr)
pattern<-"\\[.+?\\]"
str_extract_all(eq,pattern)
[[1]]
[1] "[m]" "[m]" "[m]" "[c]" "[m]" "[m]"
库(stringr)
模式
gsub
用替换字符串替换字符串的部分,但这里我们希望提取字符串而不是替换它们

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

Straplyc的核心是用tcl编写的,因此速度相当快,尽管对于像这里这样的小字符串,速度并不重要

Straply也存在
Straply
,它接受第三个参数,即应用于每个提取的捕获的函数、列表或原型对象。e、 g

> # 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" 

这个很好用,谢谢!尽管如此,我还是不明白为什么我用上面的gsub捕获的东西不起作用。现在我明白了为什么gsub和grep不起作用,谢谢你的澄清!
library(stringr)
pattern<-"\\[.+?\\]"
str_extract_all(eq,pattern)
[[1]]
[1] "[m]" "[m]" "[m]" "[c]" "[m]" "[m]"
> library(gsubfn)
> strapplyc(eq, "\\[(.*?)\\]")[[1]]
[1] "m" "m" "m" "c" "m" "m"
> # 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"