2013-01-24 31 views
4

我有這樣的路徑../some/thing/foobar/foobar.happening,我想要character字符串在最後的/.之間。路徑變量的子字符串

我意識到這對於一些人來說很容易,但我還不熟悉正則表達式等。 我也可能可以自己做到這一點strsplit,但我正在尋找一個優雅的單線程,如果可能。

在此先感謝!

+0

相關:http://stackoverflow.com/questions/14173754/splitting-a-file-name – GSee

回答

7

basename會給你最後一個斜槓後的部分。然後,您可以分割的點(你有兩個\逃跑)

> (name <- basename("../some/thing/foobar/foobar.happening")) 
[1] "foobar.happening" 
> unlist(strsplit(name, "\\.")) 
[1] "foobar" "happening" 

然後選擇第一個元素

> unlist(strsplit(name, "\\."))[1] 
[1] "foobar" 

我看你居然問比其他的方式strsplit。這裏有一個正則表達式

> sub(".*/([^/]+)\\..*", "\\1", "../some/thing/foobar/foobar.happening") 
[1] "foobar" 
  • 它尋找的東西.*
  • 零個或多個字符的字符串後跟一個斜槓/
  • 其次是什麼,是不是正斜槓[^/](括號內, ^表示「不」),一次或多次+
  • 後面跟着一個點\\.
  • 其後是任何零次或多次.*

然後它將替換那只有在括號[^/]+內的東西,這是正斜槓和點之間的所有東西。 \\1意味着第一組括號內的東西。 (在這種情況下只有一組,但如果有一秒鐘我們可以用\\2來引用它)

+0

THX的偉大的解釋! – adibender

+0

+1對於明確的解釋 –

+0

哦很好的答案!我不知道基名功能 – LostLin

4

您可以使用basename()file_path_sans_ext()的組合。 (後者來自工具包,它附帶的基本科研分佈。)

path <- "../some/thing/foobar/foobar.happening" 

library(tools) 
file_path_sans_ext(basename(path)) 
# [1] "foobar" 

## Or, if you don't want to load the tools package 
tools::file_path_sans_ext(basename(path)) 
# [1] "foobar" 
+0

doh!幾個星期前我剛剛推薦了這個功能,但今天我想不起來。 – GSee

+0

用於'file_path_sans_ext'的+1。我知道這必須在某個地方。儘管如此,這真是一個可怕的名字。 –

+0

這是值得快速看看函數def,看到它的一些額外的東西,它提交文件的名字...... –