2013-03-15 3 views
7

私はファイル名である一連の文字列を持っています。 #記号の後でファイル拡張子の前にすべての文字を抽出したいと思います。たとえば、ファイル名のいずれかです:Rは部分文字列と正規表現を取得していますか?

HelloWorld#you.txt 

私はここで、文字列you

を返すようにしたいと思う私のコードです:

hashPos = grep("#", name, fixed=TRUE) 
    dotPos = length(name)-3 
    finalText = substring(name, hashPos, dotPos) 

私はgrepを返すことになっていることをオンラインで読みます最初のパラメータが出現するインデックス(この場合は#記号)。だから、私は上記がうまくいくと思っていましたが、そうではありません。

または、この文字列を抽出するために正規表現を使用するにはどうすればよいですか? また、文字列に#記号がない場合はどうなりますか?関数は-1のような特別な値を返しますか?

答えて

10

はワンライナーソリューションです

gsub(".*\\#(.*)\\..*", "\\1", c("HelloWorld#you.txt")) 

出力:

you 

コードを説明するために、それは#までのすべてを一致させ、その後、すべての単語文字を抽出し、 .になるので、最終出力はあなたが探している中間の文字列になります。

編集

上記の溶液は、すなわちファイル名が複数のドットを持つことができるように、最後の.にファイル名を一致します。あなたが最初.に名前を抽出したい場合は、代わりに正規表現.*\\#(\\w*)\\..*を使用することができます。

+0

は、私の誤ったコメントを削除しました。 –

+2

読者がまだ混乱している場合は、このページの下部にある表(http://www.endmemo.com/program/R/gsub.php)を確認できます。それは私をたくさん助けました。 – ehsan88

+0

endmemo投稿は非常に役に立ちました。また、私は複数の "。"を扱う点で、@ Chinmay Patilの答えが優れていると思った。 – Stan

2

grepは、(それが1を返す必要がありますので、HelloWorldの#はyou.txtは、一つだけのアイテムを持っている)項目番号ではなく、文字の配置の面でインデックスを返します。

代わりにregexprを入力すると、項目ではなく文字がカウントされます。ここで

hashPos = regexpr("#", name, fixed=TRUE) + 1 
dotPos = length(name)-3 
finalText = substring(name, hashPos, dotPos) 
4

あなたはgsubを使用することができます。この方法の利点は、あなたが最後まで複数. Sを一致させることができますです。

> s <- 'HelloWorld#you.and.me.txt' 
> gsub('.*#(.*)\\.+.*','\\1', s) 
[1] "you.and.me" 
6

gsubfn packagestrapplycを使用してこれを試してすぐに#後の単語を抽出するためにstrapplyc

> library(gsubfn) 
> 
> strapplyc("HelloWorld#you.txt", "#(\\w+)")[[1]] 
[1] "you" 

やドットが含まれているために、ファイル名を可能にするこの:

> strapplyc("HelloWorld#you.txt", "#(.*)\\.")[[1]] 
[1] "you" 

file_path_sans_ext

> library(tools) 
> 
> file_path_sans_ext(sub(".*#", "", "HelloWorld#you.txt")) 
[1] "you" 

を追加しました::追加のソリューション

2

このソリューションは望んでいない人のために簡単ですが、以下のように(そう余分なパッケージをインストールする必要がなくRにバンドルされている)ツールパッケージを使用して、他の多くのファイル名指向のアプローチがあります正規表現を学ぶことはできますが、ポスターの意図に沿ったものではありません(将来のサーチャーのために)。この方法は、#がない場合、関数がcharacter(0)を返すために適用されます。

library(qdap) 
x <- c("HelloWorld#you.txt", "HelloWorldyou.txt") 
genXtract(x, "#", ".") 

収量:

> genXtract(x, "#", ".") 
$`# : right1` 
[1] "you" 

$`# : right2` 
character(0) 

私はラベルのバグではなく、実際の戻り値があると思うけど

EDIT:これは実際に開発版で修正されたバグです。 develで出力します。バージョン:

> genXtract(x, "#", ".") 
$`# : .1` 
[1] "you" 

$`# : .2` 
character(0) 
関連する問題