2016-08-01 12 views
-1

私はいくつかの部分文字列で、この文字列を分割したい: 0、7965:{7347に参加| AB012574 | 8272373:Rでstr_split()を使用するには?

BAA33520.2 | GI | /遺伝子は= "vpf402"、/製品= "Vpf402" :591}

セパレータは| (アスキー124)。
これは他のすべてのセパレータで動作しますが、このセパレータでは動作しません。

+0

PS:スプリット機能は、セパレータとして使用されます。 – CLM

+0

あなたは何をしようとしましたか? – hrbrmstr

+1

エスケープしてみましたか? '\\ |' – aosmith

答えて

5

?regex

2つの正規表現は、中置オペレータ|によって接合されてもよいです。結果の正規表現は、いずれかの部分式に一致する文字列に一致します。たとえば、abba|cdeは、文字列abbaまたは文字列cdeと一致します。文字クラス内では、代替文字は機能しません(|は文字通りの意味があります)。

基本的なビルディングブロックは、1文字に一致する正規表現です。すべての文字と数字を含むほとんどの文字は、それ自身と一致する正規表現です。特別な意味を持つメタキャラクタは、その前にバックスラッシュを付けて引用することができます。拡張正規表現のメタキャラクタは. \ | () [ {^$ * + ?ですが、これらが特別な意味を持つかどうかはコンテキストによって異なります。したがって

stringr::str_split('BAA33520.2|/gene="vpf402",/product="Vpf402"|GI:8272373|AB012574|join{7347:7965, 0:591}', "\\|") 

Frankが指摘@として、あなたはfixed=TRUEを追加することによって、base::strsplit()でこれを行うことができます。

strsplit('BAA33520.2|/gene="vpf402",/product="Vpf402"|GI:8272373|AB012574|join{‌​7347:7965, 0:591}',"|", fixed=TRUE) 

しかし、あなたも飾ることでstringr::str_split()でこれを行うことができますセパレータの正規表現:

stringr::str_split('BAA33520.2|/gene="vpf402",/product="Vpf402"|GI:8272373|AB012574|join{7347:7965, 0:591}', 
        regex("|", literal=TRUE)) 

ちなみに、stringrはかなりこの時点でちょうどわずか友好ラッパーstringiに機能していると、それは文字列spilttingの外にいくつかの素晴らしい宝石が含まれているように私は非常にstringiパッケージを勉強をお勧めします。

+1

ベースRでは、この 'strsplit( 'BAA33520.2 |/gene =" vpf402 "、/ product =" Vpf402 "| GI:8272373 | AB012574)を回避するためにfixed = TRUEを設定することもできます| join {7347:7965、0:591} '、 "|"、fixed = TRUE) '。オプションがstringrに含まれていないようです。 – Frank

+0

親愛なる皆さん、あなたの提案をありがとう、彼らは素晴らしく働いた! – CLM

+0

+1。その場合は、アンサーマークをチェックして、将来の調査者が問題を解決した答えを知るようにするのが一般的です – hrbrmstr

関連する問題