2012-09-10 11 views
5

はのは、私は、文字列があるとしましょう:括弧内のテキストを解析して返すようにRを使用し

x <- "This is a string (Yay, string!)" 

私は文字列を解析し、返却したいのですが、「イェーイ、文字列を!」

どうすればよいですか?

私はgrep/grepl/gsub/sub/etcの束を試しましたが、正規表現または引数の適切な組み合わせを見つけることができませんでした。一口。私は正規表現のスキルに取り組む必要があります。

+0

可能重複[Rにおける全ての括弧内の情報を抽出し(正規表現)](http://stackoverflow.com/questions/8613237/extract-info-inside-all-parenthesis-in-r-regex) –

+0

間違いなく、愚か者ですが、答えは異なって見えます。 –

+1

gsubfnパッケージの 'strapplyc'はそのような問題を処理します。次のコードの正規表現は '('の後ろに ')'ではない文字数を続けてかっこ内の部分を返します: 'library(gsubfn); strapplyc(x、 "\\(([^)] *)"、簡略化= TRUE) 'デフォルトで、非常に高速なtcl正規表現が使用されます。 James JoyceのUlyssesの全文を数秒で構文解析するための '?strapplyc'の例をチェックしてください。正規表現について学ぶことに関しては、gsubfnのホームページhttp://gsubfn.googlecode.comに正規表現のリソースへのリンクがあります。 –

答えて

7

は、ここでそれを行うための二つの方法があります:

ワン

したい文字列を検索し、見つかったビットを持つ文字列全体を交換してください。 (バック参照として知られている)

gsub(".*\\((.*)\\).*", "\\1", x) 
[1] "Yay, string!" 

は、これは動作します:あなたはあなたが括弧を除外したいので、カッコ(.*)

  • でマッチした文字列を参照するために後方参照\\1を使用

    • 実際の文字列の場合は、\\(\\)でこれらをエスケープする必要があります。 |ORに似た作用するため

      gsub(".*\\(|\\).*", "", x) 
      [1] "Yay, string!" 
      

      これは動作します:


  • あなたは空の文字列にしたくないすべてのビットを交換してください。あなたはこのようなものの多くをやっていないならば、qdapを得ることはやり過ぎのビットかもしれませんが

    > bracketX(x) 
    [1] "This is a string" 
    > bracketXtract(x) 
    [1] "Yay, string!" 
    

    library(qdap) 
    x <- "This is a string (Yay, string!)" 
    
    bracketX(x) 
    bracketXtract(x) 
    

    収量:

    +0

    '\\ 1'用のドキュメントがありますか?私はgrepの一番下にそれについて読むが、それを理解していない。 –

    +2

    @BrandonBertelsen私は少し答えを拡大しましたが、一般的に私のアドバイスはどこからでも正規表現を学ぶことです。例えば、ここには[バックリファレンスに関するチュートリアル](http://www.regular-expressions.info/brackets.html)があります。 – Andrie

    +0

    @BrandonBertelsen反対のアプローチを追加しました。空の文字列。 – Andrie

    2

    qdap version 1.1.0はこれを行うことができます。

    編集:ジョシュの例で...また

    > x <- "This is (a) string (Yay, string!)" 
    > bracketX(x) 
    [1] "This is string" 
    > bracketXtract(x) 
    [1] "a"   "Yay, string!" 
    
    4

    、あなたの文字列の一部を取り出したいすべてがいくつかの括弧で囲まれた部分文字列を、含まれている可能性がある場合、正規表現を使用して、パワーツールgregexpr()regmatches()

    x <- "This is (a) string (Yay, string!)" 
    pat <- "(?<=\\()([^()]*)(?=\\))" 
    regmatches(x, gregexpr(pat, x, perl=TRUE)) 
    # [[1]] 
    # [1] "a"   "Yay, string!" 
    
    +0

    ちょうどそのように、私は今、私の**答え**は、上記のタイラー・リンカーによって一瞬前に参照されたものと全く同じです! –

    +4

    私はこの答えを正確な重複として閉じようとしました... –

    +0

    これは 'qdap'の' bracketX'と 'bracketXtract'関数の基礎となりました。私は似ている質問をし、さらに詳細をここに提供します:http://stackoverflow.com/questions/8621066/remove-text-inside-brackets-parens-and-or-braces –

    関連する問題