我有一个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)依赖于特定的文件扩展名。
答案 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的情况下,我无法看到两种方法的任何特定优点或缺点。