You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:36:28