路径变量的子串

时间:2013-01-24 21:53:04

标签: regex r

我有一个类似../some/thing/foobar/foobar.happening的路径,我想要character/之间的.字符串。

我意识到这对某些人来说很容易,但我还不熟悉正则表达式等。 我也可以自己用strsplit来做这件事,但如果可能的话,我正在寻找一个优雅的单行。

提前致谢!

2 个答案:

答案 0 :(得分: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来引用它)

答案 1 :(得分:4)

您可以使用basename()file_path_sans_ext()的组合。 (后者来自工具包,它附带了基本的R发行版。)

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"