提取通过相对于其他相对定位的字符定位而定义的子字符串

时间:2018-08-06 07:41:04

标签: r regex string

我在字符向量中有很多URL,我正在尝试使用基数R从它们中提取子字符串。我想提取两种类型的子字符串:

  • 字符串中最后一个斜杠(/)之后和最后一个下划线(_)之前的子字符串。
  • 最后一个下划线(_)之后和.tar.gz子字符串之前的子字符串。

我已经解决了这个问题的解决方案,但这涉及许多不必要的步骤。有没有一种方法可以使用每个子字符串一个正则表达式来实现此目的?

下面是我的工作示例:

# An example URL
a <- "https://cran.r-project.org/src/contrib/Archive/ggplot2/ggplot2_0.4.5.tar.gz"

# Keep everything after the last slash
b <- sub('.*\\/', '', a)
# Keep everything before .tar.gaz
c <- sub('.tar.*', '', b)

# Extract desired strings based on underscore
foo <- sub('.*\\_', '', c)
bar <- sub('\\_.*', '', c)

对于此示例,使用基数R很重要。

3 个答案:

答案 0 :(得分:2)

basename使用strsplit_的解决方案:

sub(".tar.*", "", strsplit(basename(a), "_")[[1]])
[1] "ggplot2" "0.4.5" 

答案 1 :(得分:1)

使用lookarounds

regmatches(a, regexpr('(?<=\\/)[^\\/]+(?=_)', a, perl = T))
[1] "ggplot2"
regmatches(a, regexpr('(?<=_)[^_]+(?=\\.tar\\.gz)', a, perl = T))
[1] "0.4.5"

答案 2 :(得分:0)

尝试以下模式:\/(?<package>[^\/]+)\_(?<version>[^\_\/]+).tar.gz$

在比赛中,名为package的第一个捕获组将为您提供字符串中最后一个斜杠(/)之后,最后一个下划线(_)前的子字符串,第二个,名为version子字符串会在最后一个下划线(_)之后,在子字符串.tar.gz之前。

Demo