我正在尝试从字符串中提取方括号中的内容:
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)。提前感谢!
发布于 2013-04-03 20:57:17
试试这个:
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,只是在字符串中搜索该模式,找到它,然后返回具有该模式的所有字符串,这是您的一个字符串。
发布于 2013-04-03 21:14:00
另一种选择:
library(stringr)
pattern<-"\\[.+?\\]"
str_extract_all(eq,pattern)
[[1]]
[1] "[m]" "[m]" "[m]" "[c]" "[m]" "[m]"发布于 2013-04-03 21:19:28
gsub用替换字符串替换字符串的一部分,但这里我们希望提取字符串,而不是替换它们。
gsubfn package中的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" https://stackoverflow.com/questions/15787753
复制相似问题