使用sub提取路径的一部分

时间:2019-02-13 20:54:23

标签: r regex

我正在尝试从r中的路径提取文件名。像

这样的字符串
fetch('https://localhost:44360/api/Articles/')
      .then(response => response.json())
      .then(data => {
        this.setState({ articles: data, loading: false });
      });

我要提取125514_45147_55144

我正在使用以下表达式:

someurl.com/vp/125514_45147_55144.jpg?_nc25244

虽然有效,但也去除了下划线:

 sub(".*vp/(.*?)/.*", "\\1", input) 

我不知道如何保留下划线

4 个答案:

答案 0 :(得分:5)

删除基本名称的点及其后的所有内容:

sub("\\..*", "", basename(x))
## [1] "125514_45147_55144"

如果文件名中可能包含点,则使用这种稍微复杂一点的模式:

sub("(.*)\\..*", "\\1", basename(x))
## [1] "125514_45147_55144"

答案 1 :(得分:2)

我建议将其修复为

sub(".*/vp/([^/?]*?)\\.[^/?.]*(?:\\?.*)?$", "\\1", input)

请参见regex demo

详细信息

  • .*-尽可能多0个字符
  • /vp/-文字子字符串
  • ([^/?]*?)-第1组(其捕获的值由替换模式中的\1引用):除/?以外的任何0+字符,少至可能
  • \\.-一个点
  • [^/?.]*-除.?/之外的0+个字符
  • (?:\\?.*)?-可选的子字符串,匹配?,然后匹配尽可能多的0+个字符
  • $-字符串的结尾。

使用regmatches / regexec,模式变得更加清晰:

x <- "someurl.com/vp/125514_45147_55144.jpg?_nc25244"
regmatches(x,regexec("/vp/([^/?]*)\\.",x))[[1]][2]
## => [1] "125514_45147_55144"

请参见R demo

答案 2 :(得分:2)

stringr替代

library( stringr )
str_match( "someurl.com/vp/125514_45147_55144.jpg?_nc25244", "^.*/(.*?)\\..*$" )[[2]]
#[1] "125514_45147_55144"

答案 3 :(得分:2)

受到@ G.Grothendieck答案的启发,这是一个使用dirnamebasenamechartr的无正则表达式的解决方案

x = 'someurl.com/vp/125514_45147_55144.jpg?_nc25244'
dirname(chartr(x = basename(x), ".", "/"))
# [1] "125514_45147_55144"

假设文件名中没有点。