所以我有一个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