【问题标题】:substring of a path variable路径变量的子字符串
【发布时间】:2013-01-08 19:23:27
【问题描述】:

我有一个像 ../some/thing/foobar/foobar.happening 这样的路径,我想要最后一个 /. 之间的 character 字符串。

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

提前致谢!

【问题讨论】:

标签: regex r


【解决方案1】:

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 函数
【解决方案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"

【讨论】:

  • 哇!几周前我刚刚推荐了这个功能,但今天我想不起来。
  • +1 表示file_path_sans_ext。我知道这一定是在某个地方。不过,它的名字多么糟糕。
  • 值得快速看一下函数 def,看看它对文件名所做的一些额外操作......
  • 和两个函数通勤!
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多