如何编写正则表达式筛选1970年及以后的命名含年份文件?
筛选1970-2021年目标文件的正则表达式解决方案
文件情况与需求
我有一批涵盖1881-2021年各月份的文件,文件名格式为月份/年份,示例如下:
01_Jan/193501asc.gz09_Sep/188209asc.gz01_Jan/197501asc.gz07_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.gz07_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
相关产品推荐
相关产品推荐

