我正在尝试从字符串中提取方括号之间的内容:
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 中的“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]"
你的第一个模式没有工作,因为一个额外的括号从未被发现:
gsub("\\[(.+)?\\])", "\\1", eq) # Yours
gsub("\\[(.+?)\\]", "\\1", eq) # Corrected -- kind of
[1] "(5) hm + nadhm + q10m --> (4) hc + nadm + q10h2m"
您实际上正在做的是用您的第一个括号部分替换匹配的每个实例,这不是您想要的。
您的第二个模式,使用 grep
,简单地搜索字符串中的模式,找到它,然后返回所有具有该模式的字符串,这是您的一个字符串。
关于regex - R:gsub 和捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15787753/