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



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

例如,如果我的向量是("aback"、"abase"、"anate"、"玛瑙"、"alie"(,并且我正在寻找包含这两个词的单词;a";以及";b";,我希望函数返回("aback"、"abase"、"anate"(。我不在乎这些字母在单词中的位置或出现次数,只在乎单词中同时包含这两个字母。

我试图通过创建一个函数来实现这一点,该函数旨在将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)]

我上面写的函数肯定没有做它想要做的事情

我想知道是否有一种更简单的方法可以用regex模式来实现这一点,或者有一种方法可以将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).*$

演示2

相关内容

  • 没有找到相关文章