web-dev-qa-db-ja.com

正規表現はファイル名を返し、パスとファイル拡張子を削除します

ファイル名のテキスト列を含むdata.frameがあります。パスやファイル拡張子を付けずにファイル名を返したいのですが。通常、私のファイル名には番号が付けられていますが、番号を付ける必要はありません。例えば:

df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext"))

同等のものを返品したい

df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))

しかし、gsubでこれを行うための滑らかな正規表現を理解することはできません。たとえば、拡張子を次のように削除できます(ファイル名が数字で終わっている場合):

gsub('([0-9]).ext','',df[,"fileNames"])

(このサイトの正規表現ヘルプファイルや同様のソリューションを読んで)さまざまなパターンを試してきましたが、最後の「/」と最初の「。」の間のテキストを返す正規表現を取得できません。同様の質問への考えや転送は大歓迎です!

私が得た最高のものは:

 gsub('*[[:graph:]_]/|*[[:graph:]_].ext','',df[,"fileNames"])

ただし、これは1)先頭のパス文字をすべて削除するわけではなく、2)特定のファイル拡張子に依存します。

16
Docuemada

おそらく、これによりソリューションに近づくことができます。

library(tools)
basename(file_path_sans_ext(df$fileNames))
# [1] "NAME1" "name2"

file_path_sans_ext関数は「tools」パッケージ(通常はRに付属していると思います)からのものであり、拡張子までのパスを抽出します(ただし、拡張子は含まれません)。 basename関数は、パス情報を削除します。

または、file_path_sans_extから取得して少し変更するには、次のことを試してください。

sub("(.*\\/)([^.]+)(\\.[[:alnum:]]+$)", "\\2", df$fileNames)
# [1] "NAME1" "name2"

ここでは、「fileNames」変数の3つの部分すべてを「キャプチャ」したので、ファイルパスだけが必要な場合は、"\\2""\\1"に変更し、ファイル拡張子だけが必要な場合は、 、"\\3"に変更します。

35

まず、「先頭のパス」を取り除くには、basenameを使用できます。拡張子を削除するには、質問の説明と同様にsubを使用できます。

_filenames <- sub("\\.[[:alnum:]]+$", "", basename(as.character(df$fileNames)))
_

ここでは、subの代わりにgsubを使用する必要があることに注意してください。これは、ファイル拡張子がファイル名ごとに1回しか発生しないためです。また、任意の記号に一致する_\\._の代わりに、ドットに一致する_._を使用する必要があります。最後に、パターンに_$_を追加して、ファイル名の末尾にある場合にのみ拡張子を削除するようにする必要があります。

編集: Ananda Mahtoのソリューションで提案されている関数_file_path_sans_ext_は、上記のように拡張子を削除する代わりに、sub("([^.]+)\\.[[:alnum:]]+$", "\\1", x)ieを介して機能します。ファイル名の拡張子部分は保持されます。両方の方法の特定の長所または短所はわかりませんOPの場合

10
QkuCeHBH