我有一个类似../some/thing/foobar/foobar.happening
的路径,我想要character
和/
之间的.
字符串。
我意识到这对某些人来说很容易,但我还不熟悉正则表达式等。
我也可以自己用strsplit
来做这件事,但如果可能的话,我正在寻找一个优雅的单行。
提前致谢!
答案 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"