使用sub提取路径的一部分

问题描述 投票:3回答:4

我正在尝试从r中的路径中提取文件名。像一个字符串

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

我想提取125514_45147_55144

我正在使用以下表达式:

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

哪个有效,但它也剥离了下划线:

1255144514755144

我无法弄清楚如何保留下划线

r regex
4个回答
5
投票

删除基点名称后面的点和所有内容:

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

如果文件名中可能有点,那么使用这个稍微复杂的模式:

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

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
投票

stringr替代方案

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

2
投票

灵感来自@ G.Grothendieck的答案,使用dirnamebasenamechartr的无正则表达式解决方案

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

假设文件名中没有点。

© www.soinside.com 2019 - 2024. All rights reserved.