2013-01-24 34 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,看到它的一些额外的东西,它提交文件的名字...... –