2011-12-23 10 views
28

文字列があり、複数のかっこ内の情報を抽出することができます。現在、私は最後のかっこの情報を以下のコードで抽出することができます。どのようにして複数の括弧を抽出し、ベクトルとして返すようにすればよいでしょうか?すべてのかっこ内の情報を抽出するR

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

電流出力は次のようになります。

[1] "Laugh" 

所望の出力は次のようになります。私はこれがうまく動作するはずだと思う

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

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

答えて

30

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

しかし、結果には括弧が含まれています...なぜですか?

これは動作します:

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

おかげ@MartinMorganコメント。

+1

注:これはベクターでは機能しますが、データフレームの列のテキストでは機能しません。 – AudileF

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への依存関係を追加しますが、少し作業が簡単でコードが少しはっきりしていると思います(正規表現を使用すると明らかです...)

編集:このようなものを試してみてください。

これは、正規表現内にマーク付き部分式を定義することで動作します。これは、正規表現に一致するすべてを抽出し、gsubは部分式の中の部分だけを抽出します。

3

rexを使用すると、このタイプのタスクを少し簡単にすることができます。

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

matches[[1]]$text 
#>[1] "wonder" "groan" "Laugh" 
関連する問題