正则表达式返回文件名,删除路径和文件扩展名
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 的快速而翔实的回复。以上是关于正则表达式返回文件名,删除路径和文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章