2011-12-23 63 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"