2016-12-09 11 views
1

文字列の一部を抽出したいと思います。文字列は次のとおりです。Rを使って文字列を検索する:これはなぜ機能しないのですか?

> # get "ab/cd efgh" 
> sub(" \"[/A-Za-z ]+\"","",x) 
[1] "ab/cd efgh" 

をしかし、私は、第二の部分を抽出することに成功していない:

> (x <- 'ab/cd efgh "xyz xyz"') 
> [1] "ab/cd efgh \"xyz xyz\"" 

、私は最初の部分を抽出する第一希望

> # get "xyz xyz" 
> sub("(\"[A-Za-z ]+\")$","\\1",x, perl=TRUE) 
[1] "ab/cd efgh \"xyz xyz\"" 

何このコードは間違っていますか?
ありがとうございました。

+3

あなたは文字列全体と一致する必要があり、「*。」: 'サブ(「*(\を。」 [A-Za-z] + \ ")$"、 "\\ 1"、x、perl = TRUE) 'が動作します。ヘルプファイルから: "置換されていない文字ベクトルxの要素は変更されずに返されます。" – lmo

+1

Rの一致を抽出するためのツールは 'regmatches'ですが、それはちょっと複雑です。 – Frank

+0

@lmo説明してくれてありがとう。私はあなたにポイントを与えることができるように答えにあなたのコメントを入れてください。 – giordano

答えて

1

あなたの最後のスニペットは、あなたが戻って結果にマッチ全体を再挿入するので動作しません:(\"[A-Za-z ]+\")$試合をして戻ってそれを置く交換でグループ1と\1"、1+文字とスペース、"をキャプチャします。

あなたが実際に文字列の先頭に"以外のすべての文字を削除することによって、引用符内の最後の部分を取得することがあります。

x <- 'ab/cd efgh "xyz xyz"' 
sub('^[^"]+', "", x) 

R demo

ここsubは一度だけ検索と置換されます参照してください。文字列startと一致し(^)、"以外の1文字以上の文字と、[^"]+文字クラスが無効になります。

+1

回答と解決に感謝します。 – giordano

+0

私は助けてくれるとうれしいです、答えを受け入れることを検討してください。 –

1

これをsubと動作させるには、文字列全体を一致させる必要があります。ヘルプファイルには、

と書かれています。subとgsubは、xと同じ長さと同じ属性の文字ベクトルを返すことができます。置換されていない文字ベクトルxの要素は、(宣言された任意のエンコーディングを含めて)変更されずに返されます。だからあなたの正規表現で動作するように、この、事前保留時には危険なキャッチオール取得する

sub(".*(\"[A-Za-z ]+\")$","\\1",x, perl=TRUE) 
[1] "\"xyz xyz\"" 
関連する問題