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

时间:2013-02-25 18:24:10

标签: 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"))

我想返回相当于

的内容
df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))

但我无法弄清楚使用gsub执行此操作的光滑正则表达式。例如,我可以摆脱扩展名(假设文件名以数字结尾):

gsub('([0-9]).ext','',df[,"fileNames"])

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

我得到的最好的是:

 gsub('*[[:graph:]_]/|*[[:graph:]_].ext','',df[,"fileNames"])

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

2 个答案:

答案 0 :(得分:34)

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

library(tools)
basename(file_path_sans_ext(df$fileNames))
# [1] "NAME1" "name2"

file_path_sans_ext函数来自“tools”包(我认为通常附带R),这将提取到(但不包括)扩展的路径。然后basename函数将删除您的路径信息。

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

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

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

答案 1 :(得分:9)

首先,要摆脱“领先路径”,可以使用basename。要删除扩展程序,您可以使用sub类似于问题中的描述:

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

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

修改:Ananda Mahto解决方案中建议的函数file_path_sans_ext通过sub("([^.]+)\\.[[:alnum:]]+$", "\\1", x)而不是如上所述删除扩展,非保留文件名的 - 扩展部分。在OP的情况下,我无法看到两种方法的任何特定优点或缺点