2011-12-23 87 views
28

我有一个字符串以及如何提取多个括号内的信息。目前我可以从下面的代码中提取最后一个括号中的信息。我该怎么做才能提取多个圆括号并作为矢量返回?提取R中所有括号内的信息

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

电流输出是:

[1] "Laugh" 

所需的输出是:

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

回答

30

下面是一个例子:

> 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的评论。

+1

注意:这将适用于矢量,但不适用于数据框的列中的文本。 – AudileF 2017-12-13 14:07:17

13

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

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,因此目前无法访问该功能。这增加了对stringr的依赖,但我认为这是一个有点容易使用,而且代码更清晰一点的(嗯,明确的,因为使用正则表达式可以...)

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

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

这一个工程通过定义正则表达式中的显着的子表达式。它提取与正则表达式匹配的所有内容,然后gsub只提取子表达式内的部分。

3

使用rex可能会使这种类型的任务更简单一些。

matches <- re_matches(j, 
    rex(
    "(", 
    capture(name = "text", except_any_of(")")), 
    ")"), 
    global = TRUE) 

matches[[1]]$text 
#>[1] "wonder" "groan" "Laugh"