R语言中如何跳过前13字符进行模式匹配筛选文件名?
按年份筛选固定长度ID的正确方法
我有一批长度固定的文件名/唯一ID,包含州、纬度、经度、年、月、日信息,例如fl294670818202019。想通过模式匹配按年份筛选列表,但现有代码会出现误匹配——比如年份为2019的ID里,经度和年份的组合也会包含"2020",导致被错误筛选出来。
示例代码:
# 年份为2020的唯一ID x <- "fl301330850282020" # 年份为2019但包含2020模式的唯一ID y <- "fl294670818202019" # 创建列表 (z <- list(x,y)) # 按模式筛选列表(存在误匹配问题) z %>% str_subset(pattern = "2020")
解决方法:跳过前13个字符后再搜索
你可以通过两种方式实现,无需删除前13个字符:
方法1:使用正则表达式指定匹配位置
利用正则表达式匹配前13个任意字符,再紧跟目标年份,确保只在第14个字符开始的位置搜索:
library(stringr) # 正确筛选年份为2020的ID z %>% str_subset(pattern = "^.{13}2020")
^.{13}:匹配字符串开头的任意13个字符2020:指定要搜索的年份,确保它出现在前13个字符之后
方法2:先截取子串再判断
先提取从第14位开始的子串,再检查是否包含目标年份,逻辑更直观:
library(stringr) library(purrr) z %>% keep(~str_detect(str_sub(., 14), "2020"))
str_sub(., 14):提取当前ID从第14个字符开始的部分str_detect(...):判断子串是否包含目标年份keep:保留符合条件的列表元素
内容的提问来源于stack exchange,提问作者derelict
相关产品推荐
相关产品推荐

