提取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"