R语言:如何筛选同时包含多个指定子串的文件名?
解决同时匹配多个子串的文件名筛选问题
嗨,我懂你的困扰——你想要的是同时包含Fasted和DWeib NoCmaxW两个子串的文件名,而不是满足任意一个条件就行。之前用paste(toMatch, collapse = "|")是逻辑或(OR)的匹配,所以会把所有带Fasted或者带DWeib NoCmaxW的文件都列出来,这就出现了5个结果。下面给你几种靠谱的解决方法:
方法1:嵌套使用grep(基础R实现)
先过滤出包含第一个子串的文件,再在这个结果里过滤包含第二个子串的,用嵌套grep实现逻辑与:
files.list <- c("Fasted DWeib NoCmaxW.xlsx", "Fed DWeib NoCmaxW.xlsx", "Fasted SWeib NoCmaxW.xlsx", "Fed SWeib NoCmaxW.xlsx", "Fasted DWeib Cmax10.xlsx", "Fed DWeib Cmax10.xlsx", "Fasted SWeib Cmax10.xlsx", "Fed SWeib Cmax10.xlsx") toMatch <- c("Fasted", "DWeib NoCmaxW") grep(toMatch[2], grep(toMatch[1], files.list, value = TRUE), value = TRUE)
运行后会精准返回你要的结果:
[1] "Fasted DWeib NoCmaxW.xlsx"
方法2:正则正向预查(Perl风格正则)
用正则的正向预查语法,一次性写出“同时包含两个子串”的规则:
grep("(?=.*Fasted)(?=.*DWeib NoCmaxW)", files.list, value = TRUE, perl = TRUE)
这里(?=.*xxx)表示“字符串中存在xxx子串”,两个预查组合就要求同时满足两个条件,需要加上perl=TRUE来启用Perl风格的正则支持。
方法3:用stringr包(更直观的逻辑)
如果你习惯用tidyverse系列工具,stringr包的str_detect能让逻辑更清晰,直接用&做逻辑与判断:
library(stringr) files.list[str_detect(files.list, "Fasted") & str_detect(files.list, "DWeib NoCmaxW")]
这个写法可读性更强,结果和前两种方法完全一致。
内容的提问来源于stack exchange,提问作者please help
相关产品推荐
相关产品推荐

