使用带有r中多个条目的grep来查找匹配的字符串

时间:2015-06-10 16:01:56

标签: r

如果我有一个字符串向量:

dd <- c("sflxgrbfg_sprd_2011","sflxgrbfg_sprd2_2011","sflxgrbfg_sprd_2012")

想要找到2011年&#39;&#39;在我可以使用的字符串中

ifiles <- dd[grep("2011",dd)]

如何在不使用循环的情况下搜索包含字符串组合的条目?

例如,我想找到同时包含&#39; 2011&#39;和&#39; sprd&#39;在字符串中,在这种情况下只返回

sflxgrbfg_sprd_2011

如何做到这一点?我可以定义一个变量

toMatch <- c('2011','sprd)

然后循环访问条目,但我希望有更好的解决方案?

注意:使其对不同的字符串有用。是否也可以确定哪些条目具有这些字符串而不显示它们。例如,&#39; sflxlgrbfg_2011_sprd&#39;

3 个答案:

答案 0 :(得分:3)

如果要查找多个模式,请尝试使用逻辑值而不是数字进行索引。这样你就可以创建一个&#34;和&#34;条件,其中只提取具有两种模式的字符串。

ifiles <- dd[grepl("2011",dd) & grepl("sprd_",dd)]

答案 1 :(得分:2)

尝试

  grep('2011_sprd|sprd_2011', dd, value=TRUE)
 #[1] "sflxgrbfg_sprd_2011"  "sflxlgrbfg_2011_sprd"

或使用包含更多模式的示例

 grep('(?<=sprd_).*(?=2011)|(?<=2011_).*(?=sprd)', dd1,
             value=TRUE, perl=TRUE)
 #[1] "sflxgrbfg_sprd_2011"       "sflxlgrbfg_2011_sprd"     
 #[3] "sfxl_2011_14334_sprd"      "sprd_124334xsff_2011_1423"

数据

dd <- c("sflxgrbfg_sprd_2011","sflxgrbfg_sprd2_2011","sflxgrbfg_sprd_2012", 
"sflxlgrbfg_2011_sprd")

dd1 <- c(dd,  "sfxl_2011_14334_sprd", "sprd_124334xsff_2011_1423")

答案 2 :(得分:0)

如果您想要一个可扩展的解决方案,可以使用lapplyReduceintersect来:

  1. 对于toMatch中的每个表达式,找到dd中所有匹配项的索引。
  2. 仅保留为toMatch中的所有表达式找到的索引。
  3. dd <- c("sflxgrbfg_sprd_2011","sflxgrbfg_sprd2_2011","sflxgrbfg_sprd_2012")
    dd <- c(dd, "sflxgrbfh_sprd_2011")
    toMatch <- c('bfg', '2011','sprd')
    
    dd[Reduce(intersect, lapply(toMatch, grep, dd))]
    #> [1] "sflxgrbfg_sprd_2011"  "sflxgrbfg_sprd2_2011"
    

    reprex package(v0.2.0)创建于2018-03-07。