9

ファイル名である文字列のセットがあります。# 記号の後、ファイル拡張子の前のすべての文字を抽出したい。たとえば、ファイル名の 1 つは次のとおりです。

HelloWorld#you.txt

文字列を返したいyou

これが私のコードです:

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

grep最初のパラメーターが発生するインデックス (この場合は # 記号) を返すことになっているオンラインを読みました。したがって、上記が機能することを期待していましたが、機能しません。

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

4

6 に答える 6

17

ここにワンライナーソリューションがあります

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

出力:

you

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

編集

上記のソリューションは、ファイル名を最後まで一致させます.。つまり、ファイル名に複数のドットを含めることができます。名前を最初まで抽出したい場合は、代わり.に正規表現を使用できます。.*\\#(\\w*)\\..*

于 2013-03-15T00:47:07.997 に答える
6

strapplyc gsubfn パッケージのstrapplycを使用して、#これを試した直後に単語を抽出するには:

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

またはこれにより、ファイル名にドットを含めることができます。

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

ツール パッケージ (R にバンドルされているため、追加のパッケージをインストールする必要はありません) を使用した別のよりファイル名指向のアプローチは次のとおりです。

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

追加: 追加のソリューション

于 2013-03-15T00:51:11.440 に答える
4

使用できますgsub.これの利点は、最後の s まで複数の s を一致させることができることです。

> s <- 'HelloWorld#you.and.me.txt'
> gsub('.*#(.*)\\.+.*','\\1', s)
[1] "you.and.me"
于 2013-03-15T00:49:17.023 に答える
2

このソリューションは、正規表現を学びたくない人にとっては簡単ですが、投稿者の意図と一致しません (将来の検索者向け)。#このアプローチは、関数が戻り値がない場合をカバーしますcharacter(0)

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

収量:

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

$`#  :  right2`
character(0)

ラベルにはバグがあると思いますが、実際の戻り値にはありません。

編集:これは確かに開発版で修正されたバグです。develで出力します。バージョン:

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

$`#  :  .2`
character(0)
于 2013-03-15T01:56:00.830 に答える
2

grep文字の配置ではなく、項目番号に関するインデックスを返します (HelloWorld#you.txt には項目が 1 つしかないため、1 を返す必要があります)。

regexpr代わりに、アイテムではなく文字をカウントします。

hashPos = regexpr("#", name, fixed=TRUE) + 1
dotPos = length(name)-3
finalText = substring(name, hashPos, dotPos)
于 2013-03-15T00:44:02.463 に答える