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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:18:27