【发布时间】:2013-01-08 19:23:27
【问题描述】:
我有一个像 ../some/thing/foobar/foobar.happening 这样的路径,我想要最后一个 / 和 . 之间的 character 字符串。
我意识到这对某些人来说很容易,但我还不熟悉正则表达式等。
我也可以自己使用strsplit 完成此操作,但如果可能的话,我正在寻找一个优雅的单线。
提前致谢!
【问题讨论】:
我有一个像 ../some/thing/foobar/foobar.happening 这样的路径,我想要最后一个 / 和 . 之间的 character 字符串。
我意识到这对某些人来说很容易,但我还不熟悉正则表达式等。
我也可以自己使用strsplit 完成此操作,但如果可能的话,我正在寻找一个优雅的单线。
提前致谢!
【问题讨论】:
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 引用它)
【讨论】:
您可以使用basename() 和file_path_sans_ext() 的组合。 (后者来自 tools 包,它随基本 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"
【讨论】:
file_path_sans_ext。我知道这一定是在某个地方。不过,它的名字多么糟糕。