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

list.files中使用排除_files结尾的正则报错,如何直接过滤结果?

问题解答

为啥正则在list.files里无效?

list.files()默认使用POSIX标准正则,不支持(?!...)这种Perl风格的负前瞻断言;而stringr系列函数基于ICU正则引擎,天生支持这类高级语法,所以同样的正则在两个场景下表现完全不同。

解决办法

办法1:开启Perl正则模式

给list.files()加上perl=TRUE参数,就能直接用你原来的正则:

list.files(pattern = '^(?!.*_files).*$', perl = TRUE)

如果想更精准匹配不以_files结尾的元素,正则可以调整为:

list.files(pattern = '^(?!.*_files$).*', perl = TRUE)

办法2:用base R原生方式过滤

先获取全量文件/文件夹列表,再把目标元素移除:

# 获取所有项
all_items <- list.files()
# 剔除以_files结尾的元素
filtered_items <- all_items[!grepl('_files$', all_items)]

或者用setdiff实现更简洁的写法:

filtered_items <- setdiff(list.files(), grep('_files$', list.files(), value = TRUE))

办法3:POSIX兼容写法(不推荐)

如果不想依赖Perl正则,也能写POSIX兼容的匹配规则,但写法繁琐,实用性不如前两种:

# 注:本质还是需要开启perl=TRUE,因为POSIX正则不支持负后向断言,所以意义不大
list.files(pattern = '^.*(?<!_files)$', perl = TRUE)

内容的提问来源于stack exchange,提问作者deschen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:25:20