regex - R:gsub 和捕获

标签 regex string r gsub regex-greedy

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

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/

相关文章:

regex - 使用正则表达式无法逃脱反斜杠?

java - Java 中的连接正则表达式匹配标记

java - 在 Java 中使用 substring()

string - 如何拆分包括标点符号的句子

r - 计算从昨天收盘价的每日百分比变化并将其应用于多个股票代码的函数

r - 用格子绘制回归线

regex - Dart如何将逗号添加到字符串编号

Python 正则表达式在论文中获取引用

C 读取文件到动态列表、动态字符串

r - 将 plyr::mapvalues 与 dplyr 一起使用