使用dir_ls正则过滤文件时^符号失效问题求助
问题:正则表达式添加
^后返回空值的原因 我的文件夹里有4个文件:
!AR01_061.TXT AR01_060.TXT AR01_061.TXT AR01_062.TXT
目标是筛选出3个以AR01_开头的文件,我先试了这段代码:
Duzy.rej <- dir_ls(paste0(sciezka, "/Duzy rejestrator/"), regexp = "(AR01_.)(.*\\.TXT$)") print(Duzy.rej)
执行结果把带!的文件也包含进去了:
> print(Duzy.rej) K:/Inne/WM/Duzy rejestrator/AR01_061.TXT K:/Inne/WM/Duzy rejestrator/!AR01_061.TXT K:/Inne/WM/Duzy rejestrator/AR01_062.TXT K:/Inne/WM/Duzy rejestrator/AR01_060.TXT
于是我给正则表达式加了^符号,想让它只匹配开头是AR01_的文件:
Duzy.rej <- dir_ls(paste0(sciezka, "/Duzy rejestrator/"), regexp = "^(AR01_.)(.*\\.TXT$)") print(Duzy.rej)
结果却返回了空值:
> print(Duzy.rej) character(0)
我搞不懂为什么加了^反而匹配不到任何文件,明明是想排除非AR01_开头的文件。
原因与解决方案
核心原因
dir_ls的regexp参数是匹配完整的文件路径,而不是单独的文件名。你加^后,正则会试图匹配路径的开头就是AR01_,但实际路径是K:/Inne/WM/Duzy rejestrator/开头,自然完全匹配不上,所以返回空。
解决方案
方法1:调整正则匹配路径中的文件名部分
把正则改成匹配路径最后一段(文件名)以AR01_开头,比如:
Duzy.rej <- dir_ls(paste0(sciezka, "/Duzy rejestrator/"), regexp = "/AR01_.*\\.TXT$")
这里/AR01_匹配路径中最后一个斜杠后的AR01_,确保是文件名开头。
方法2:用glob模式替代正则(更简单)
dir_ls支持glob参数,直接匹配文件名,不用写复杂正则:
Duzy.rej <- dir_ls(paste0(sciezka, "/Duzy rejestrator/"), glob = "AR01_*.TXT")
AR01_*.TXT会直接匹配所有以AR01_开头的TXT文件,自动排除带!的那个。
方法3:先取所有文件,再提取文件名过滤
先获取所有文件路径,再用basename()提取文件名,然后用正则过滤:
all_files <- dir_ls(paste0(sciezka, "/Duzy rejestrator/")) Duzy.rej <- all_files[grepl("^AR01_.*\\.TXT$", basename(all_files))]
这种方式更直观,明确针对文件名做匹配。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

