R中ls函数pattern参数使用负向前瞻正则报错及匹配方法
问题解答
1. R的ls()函数是否支持负向前瞻正则?
ls()的pattern参数默认传递给基础的grep()函数,使用POSIX扩展正则表达式规则,本身不支持PCRE语法的负向前瞻特性,且ls()没有暴露perl = TRUE这类开启PCRE的参数,所以无法直接在ls()的pattern参数中使用负向前瞻正则,这也是你运行代码报错的直接原因。
你在regex101测试时默认开启了PCRE正则规则,和R的默认正则规则不一致,所以没有出现报错,但你写的正则本身逻辑存在缺陷,就算开启PCRE也会匹配到需要保留的ab_pm、ab_pn:正则中的_?是可选匹配,回溯时会选择不匹配下划线,导致ab_pm中开头的ab(后面紧跟下划线而非p)也会命中匹配规则。
2. 正确匹配待删除对象的实现方法
方法1:单独调用grep开启PCRE支持
绕开ls()的pattern参数,自己用grep加perl = TRUE过滤对象名,同时修正正则逻辑,代码如下:
# 修正后正则:匹配包含ab且ab后不紧跟_p的字符串 rm(list = grep("ab(?!_p)", ls(), perl = TRUE, value = TRUE))
该代码会正确匹配ab、ab_b、c1_ab_b三个待删除对象,不会命中需要保留的ab_pm、ab_pn。
方法2:使用更简单的集合差集逻辑
如果不想写复杂正则,也可以直接筛选所有含ab的对象,排除要保留的两个即可,逻辑更直观不易出错:
rm(list = setdiff(ls(pattern = "ab"), c("ab_pm", "ab_pn")))
内容的提问来源于stack exchange,提问作者elarry
相关产品推荐
相关产品推荐

