我正在尝试从r中的路径中提取文件名。像一个字符串
someurl.com/vp/125514_45147_55144.jpg?_nc25244
我想提取125514_45147_55144
我正在使用以下表达式:
sub(".*vp/(.*?)/.*", "\\1", input)
哪个有效,但它也剥离了下划线:
1255144514755144
我无法弄清楚如何保留下划线
删除基点名称后面的点和所有内容:
sub("\\..*", "", basename(x))
## [1] "125514_45147_55144"
如果文件名中可能有点,那么使用这个稍微复杂的模式:
sub("(.*)\\..*", "\\1", basename(x))
## [1] "125514_45147_55144"
我建议修复它
sub(".*/vp/([^/?]*?)\\.[^/?.]*(?:\\?.*)?$", "\\1", input)
细节
.*
- 尽可能多的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"
stringr
替代方案
library( stringr )
str_match( "someurl.com/vp/125514_45147_55144.jpg?_nc25244", "^.*/(.*?)\\..*$" )[[2]]
#[1] "125514_45147_55144"
灵感来自@ G.Grothendieck的答案,使用dirname
,basename
和chartr
的无正则表达式解决方案
x = 'someurl.com/vp/125514_45147_55144.jpg?_nc25244'
dirname(chartr(x = basename(x), ".", "/"))
# [1] "125514_45147_55144"
假设文件名中没有点。