如何在R语言中从文件名里提取目标年份?
提取文件名中目标年份的正确正则方案
你需要从给定文件名里精准提取特定4位年份,原正则因为匹配范围过宽导致结果不符合预期,下面是针对性的解决方法:
问题分析
你的原正则[0-9].*[0-9]会匹配文件名中从第一个数字开始到最后一个数字结束的所有字符,所以第二个文件会返回20140211_02_2012,第三个返回20150219_2013。而我们要的是每个文件名里最后出现的4位连续数字(也就是你需要的2014、2012、2013)。
解决方案1:基础R原生函数实现
无需额外安装包,用regexec和regmatches组合即可实现:
# 定义文件名向量 files <- c( "2014_by_country_and_type_Enlarged_Europe.xlsx", "20140211_02_2012_vo_By_Country_Enlarged_Europe.xls", "20150219_2013_vo_By_Country_Enlarged_Europe.xlsx" ) # 捕获最后出现的4位数字 match_results <- regmatches(files, regexec(".*(\\d{4})", files)) # 提取捕获组中的年份内容 target_years <- sapply(match_results, `[`, 2) # 查看结果 target_years
运行后输出:
[1] "2014" "2012" "2013"
解决方案2:用stringr包简化代码
如果习惯使用tidyverse生态的stringr包,可通过更简洁的代码实现:
library(stringr) # 提取最后出现的4位数字 target_years <- str_extract(files, "\\d{4}(?!.*\\d{4})") target_years
同样会得到你需要的目标结果。
正则逻辑解释
\\d{4}:匹配连续4位数字,符合年份的典型格式(?!.*\\d{4}):负向前瞻断言,确保当前匹配的4位数字后面不会再出现其他4位数字,从而精准定位到每个文件名里的目标年份
内容的提问来源于stack exchange,提问作者sree
相关产品推荐
相关产品推荐

