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

Posted

技术标签:

【中文标题】正则表达式返回文件名,删除路径和文件扩展名【英文标题】:Regex return file name, remove path and file extension 【发布时间】:2013-02-10 23:55:48 【问题描述】:

我有一个包含文件名文本列的 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) 依赖于特定的文件扩展名。

【问题讨论】:

【参考方案1】:

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

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

请注意,您应该在这里使用sub 而不是gsub,因为每个文件名的文件扩展名只能出现一次。此外,您应该使用匹配点的\\.,而不是匹配任何符号的.。最后,您应该将$ 附加到模式中,以确保仅当扩展名位于文件名末尾时才删除它。

编辑: Ananda Mahto 的解决方案中建议的函数file_path_sans_ext 通过sub("([^.]+)\\.[[:alnum:]]+$", "\\1", x) 工作,ie 而不是像上面那样删除扩展,非扩展部分文件名被保留。我看不出这两种方法的任何具体优点或缺点在 OP 的情况下

【讨论】:

您可能需要在df$fileNames 周围使用as.character,如果它已作为一个因素被读入,如提供的示例数据中所示。 谢谢你,也谢谢你解释正则表达式字符。这很好用。对于这个例子,我使用了 ...as.character(df$fileNames)。【参考方案2】:

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

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

file_path_sans_ext 函数来自“工具”包(我相信它通常随 R 一起提供),它将提取到(但不包括)扩展的路径。然后basename 函数将删除您的路径信息。

或者,取自file_path_sans_ext并稍作修改,您可以尝试:

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

在这里,我已经“捕获”了“fileNames”变量的所有三个部分,所以如果您只需要文件路径,您可以将"\\2" 更改为"\\1",如果您只需要文件扩展名,你可以把它改成"\\3"

【讨论】:

有趣的方法。对我来说,这种方法比正则表达式更清晰,这让我感到困惑。我试试看。 这很好,谢谢。这对我来说更有意义,但这可能是因为我需要更多地练习正则表达式! @Docuemada,没问题。如图所示,file_path_sans_ext 是一个基本的正则表达式,我怀疑 basename 是(但尚未检查验证)。 是的! sub("(.*\\/)([^.]+)(\\.[[:alnum:]]+$)", "\\2", df$fileNames) 是我所追求的。感谢您和 zipfzapf 的快速而翔实的回复。

以上是关于正则表达式返回文件名,删除路径和文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之正则表达式(sed)

正则表达式匹配路径

Bash 正则表达式重命名文件

文件操作,路径操作,StringIO和BytesIO,序列化反序列化,正则表达式与python中使用

Shell编程之正则表达式

匹配文件名开头和文件扩展名的正则表达式