我有一个 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) 依赖于特定的文件扩展名。
最佳答案
也许这会让您更接近您的解决方案:
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"
。
关于正则表达式返回文件名,删除路径和文件扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15073753/