正则表达式返回文件名,删除路径和文件扩展名

Doc*_*ada 16 regex r gsub

我有一个data.frame,其中包含文件名的文本列.我想返回没有路径或文件扩展名的文件名.通常,我的文件名已经编号,但它们不一定是.例如:

df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext"))
Run Code Online (Sandbox Code Playgroud)

我想返回相当于

df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚用gsub做这个光滑的正则表达式.例如,我可以摆脱扩展名(假设文件名以数字结尾):

gsub('([0-9]).ext','',df[,"fileNames"])
Run Code Online (Sandbox Code Playgroud)

虽然我一直在尝试各种模式(通过阅读此站点上的正则表达式帮助文件和类似的解决方案),我无法获得正则表达式返回最后一个"/"和第一个"."之间的文本.对类似问题的任何想法或转发都非常感谢!

我得到的最好的是:

 gsub('*[[:graph:]_]/|*[[:graph:]_].ext','',df[,"fileNames"])
Run Code Online (Sandbox Code Playgroud)

但是这1)没有摆脱所有的前导路径字符和2)依赖于特定的文件扩展名.

A5C*_*2T1 34

也许这会让你更接近你的解决方案:

library(tools)
basename(file_path_sans_ext(df$fileNames))
# [1] "NAME1" "name2"
Run Code Online (Sandbox Code Playgroud)

file_path_sans_ext功能来自"工具"包(我认为通常带有R),这将提取到(但不包括)扩展的路径.basename然后该函数将删除您的路径信息.

或者,从中获取file_path_sans_ext并稍微修改一下,您可以尝试:

sub("(.*\\/)([^.]+)(\\.[[:alnum:]]+$)", "\\2", df$fileNames)
# [1] "NAME1" "name2"
Run Code Online (Sandbox Code Playgroud)

在这里,我"捕获"了"fileNames"变量的所有三个部分,因此,如果您只想要文件路径,则可以更改"\\2""\\1",如果只需要文件扩展名,则可以将其更改为"\\3".


Qku*_*HBH 9

首先,要摆脱"领先的道路",你可以使用basename.要删除扩展程序,您可以sub在问题中使用与您的说明类似的内容:

filenames <- sub("\\.[[:alnum:]]+$", "", basename(as.character(df$fileNames)))
Run Code Online (Sandbox Code Playgroud)

请注意,您应该使用sub而不是gsub此处,因为文件扩展名只能为每个文件名发生一次.此外,您应该使用\\.哪个匹配点而不是.匹配任何符号.最后,您应该附加$到模式以确保仅在文件名末尾删除扩展名时才删除该扩展名.

编辑:file_path_sans_ext Ananda Mahto解决方案中建议的功能通过sub("([^.]+)\\.[[:alnum:]]+$", "\\1", x),不保留上面的扩展,而是保留文件名的非扩展部分.在OP的情况下,我看不出这两种方法的任何特定优点或缺点.