如何用R语言str_detect与正则表达式识别Spelling Bee全字母词?
解决Spelling Bee全字母词识别问题
你的代码失效的核心原因是:在dplyr::filter()中使用all(str_detect(word, required_letters))时,all()是对整个word列的结果做全局判断——它会检查所有单词是否都满足包含每一个指定字母,而不是逐个单词判断是否包含全部指定字母。这就是为什么单独测试单个单词时逻辑可行,但在tibble过滤时无法识别出"pedagogy"。
下面是三种可行的解决方案:
方案1:用purrr::map_lgl逐行判断
借助purrr的映射函数,逐个检查每个单词是否包含所有指定字母:
library(tidyverse) required_letters <- c("o", "a", "d", "e", "g", "p", "y") list_of_words <- tibble(word = c("pedagogy", "agog", "apogee", "dodge")) pangrams <- list_of_words %>% filter(map_lgl(word, ~all(str_detect(.x, required_letters))))
方案2:用rowwise()实现逐行计算
通过rowwise()让dplyr对每行单独执行判断逻辑,完成后用ungroup()恢复分组状态:
pangrams <- list_of_words %>% rowwise() %>% filter(all(str_detect(word, required_letters))) %>% ungroup()
方案3:构造正则表达式一次性匹配
利用正则的正向预查特性,把所有要求的字母组合成一个正则模式,只需一次匹配就能判断单词是否包含全部指定字母:
# 构造正则模式:每个字母对应一个(?=.*字母)的正向预查 regex_pattern <- str_c("(?=.*", required_letters, ")", collapse = "") pangrams <- list_of_words %>% filter(str_detect(word, regex(regex_pattern, ignore_case = FALSE)))
这三种方案都能正确识别出"pedagogy"作为全字母词,其中方案3在处理大规模单词列表时效率更高。
内容的提问来源于stack exchange,提问作者Teddly
相关产品推荐
相关产品推荐

