提取R中所有圆括号内的信息

我有一个string,并提取多个括号内的信息。 目前我可以从下面的代码中提取最后一个括号中的信息。 我将如何做,所以它提取多个括号和返回作为一个向量?

j <- "What kind of cheese isn't your cheese? (wonder) Nacho cheese! (groan) (Laugh)" sub("\\).*", "", sub(".*\\(", "", j)) 

电stream输出是:

 [1] "Laugh" 

期望的输出是:

 [1] "wonder" "groan" "Laugh" 

这里是一个例子:

 > gsub("[\\(\\)]", "", regmatches(j, gregexpr("\\(.*?\\)", j))[[1]]) [1] "wonder" "groan" "Laugh" 

我认为这应该运作良好:

 > regmatches(j, gregexpr("(?=\\().*?(?<=\\))", j, perl=T))[[1]] [1] "(wonder)" "(groan)" "(Laugh)" 

但结果包括括号…为什么?

这工作:

 regmatches(j, gregexpr("(?<=\\().*?(?=\\))", j, perl=T))[[1]] 

感谢@MartinMorgan的评论。

使用stringr包,我们可以减less一点点。

 library(stringr) # Get the parenthesis and what is inside k <- str_extract_all(j, "\\([^()]+\\)")[[1]] # Remove parenthesis k <- substring(k, 2, nchar(k)-1) 

@kohske使用regmatches,但我目前使用2.13所以目前没有访问该function。 这增加了对stringr的依赖,但我认为这是一个更容易处理和代码是更清楚一点(以及…使用正则expression式清晰可以…)

编辑:我们也可以尝试这样的事情 –

 re <- "\\(([^()]+)\\)" gsub(re, "\\1", str_extract_all(j, re)[[1]]) 

这个通过在正则expression式中定义一个标记的子expression式来工作。 它提取与正则expression式匹配的所有内容,然后gsub只提取子expression式内的部分。

使用rex可能会使这种types的任务变得简单一些。

 matches <- re_matches(j, rex( "(", capture(name = "text", except_any_of(")")), ")"), global = TRUE) matches[[1]]$text #>[1] "wonder" "groan" "Laugh"