You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式筛选1970年及以后的命名含年份文件?

筛选1970-2021年目标文件的正则表达式解决方案

文件情况与需求

我有一批涵盖1881-2021年各月份的文件,文件名格式为月份/年份,示例如下:

  • 01_Jan/193501asc.gz
  • 09_Sep/188209asc.gz
  • 01_Jan/197501asc.gz
  • 07_Jul/202107asc.gz

需求是筛选出1970年及以后(1970-2021年)的文件,之前尝试的R代码没能实现目标:

file_ls <- list.files(paste(myPath, "data", sep = "/"), 
                      pattern = "[>1970]",
                      #pattern = "[1970-2021]",
                      #pattern="*\\.gz$", # ending character
                      recursive=TRUE)

期望返回的文件:

  • 01_Jan/197501asc.gz
  • 07_Jul/202107asc.gz

问题分析

你之前用的正则表达式写法有误:

  • [>1970]是字符组,只会匹配单个字符(>、1、9、7、0中的任意一个),无法匹配年份范围
  • [1970-2021]同样是字符组,逻辑完全错误,不能用来匹配连续的年份区间

正确解决方案

正则表达式编写思路

文件名中的年份是4位数字,位于路径分隔符/之后,我们需要精准匹配1970-2021的年份:

  • 1970-1999年:19[7-9]\d(以19开头,第三位数字7-9,第四位任意数字)
  • 2000-2021年:20(0\d|1\d|2[01])(以20开头,第三位为0/1,或者第三位是2且第四位为0/1)

组合后的正则模式为:/(19[7-9]\d|20(0\d|1\d|2[01]))\d{2}asc\.gz$

修改后的R代码

file_ls <- list.files(file.path(myPath, "data"), 
                      pattern = "/(19[7-9]\\d|20(0\\d|1\\d|2[01]))\\d{2}asc\\.gz$",
                      recursive = TRUE)

代码说明

  • 用file.path拼接路径,比paste更适配不同操作系统
  • 正则中通过/(...)锁定路径分隔符后的年份部分,避免误匹配其他位置的数字
  • R语言中正则里的\d需要转义为\\d
  • 末尾的$确保匹配到文件结尾,排除不符合格式的文件

内容的提问来源于stack exchange,提问作者maycca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:45:25