如何在单词向量中搜索包含两个特定字母的单词

How to search a vector of words for words containing two specific letters

所以我有一个包含 5 个字母的单词的向量,我希望能够创建一个函数来提取包含模式中所有字母的单词。

例如,如果我的向量是(“aback”、“abase”、“abate”、“agate”、“allay”)并且我正在寻找同时包含“a”和“b”的词,我希望函数为 return(“aback”、“abase”、“abate”)。我不在乎这些字母在单词中的什么位置或出现了多少次,只在乎单词中包含它们。

我试图通过创建一个旨在将 grepl 与 & 组合的函数来做到这一点。但这里的问题是 grepl 函数不接受向量作为模式。我的计划是让这个函数实现grepl("a", word_vec) & grepl("b", word_vec)。我还需要它具有可扩展性,例如,如果我想搜索包含“a”和“b”和“c”的所有单词。

grepl_cat <- function(str, words_vec) {
      
      pat <- str_split(str, "")
      
      first_let = TRUE

      for (i in 1:length(pat)) {
        if (first_let){
          result <- sapply(pat[i], grepl, x = word_vec)
          first_let <- FALSE
        } 
        print(pat[i])
        result <- result & sapply(pat[i], grepl, x = word_vec)
        
      }
      
      return(result)
}

word_vec[grepl_cat("abc", word_vec)]

我上面写的函数肯定没有按预期执行。

我想知道是否有更简单的方法可以使用正则表达式模式执行此操作,或者是否有一种方法可以将 str 中的每个字母作为非向量输入到 grepl 函数中。

基于 R 的可能解决方案:

s <- c("aback", "abase", "abate", "agate", "allay")

subset(s, grepl("(a)(b)", s))

#> [1] "aback" "abase" "abate"

另一种可能的解决方案,基于tidyverse

library(tidyverse)

s <- c("aback", "abase", "abate", "agate", "allay")

s %>% 
  data.frame(s = .) %>% 
  filter(str_detect(s, "(a)(b)")) %>% 
  pull(s)

#> [1] "aback" "abase" "abate"

对于 a,b and c 正则表达式解决方案将是:

^.*a.*b.*c.*$

您可以根据需要添加更多字母

Demo1

替代正则表达式方法:

^(?=.*a)(?=.*b)(?=.*c).*$

Demo 2