如何用stringr::str_which检测列表中含精确匹配词的向量?
解决str_which精确匹配列表中字符向量元素的问题
你遇到的问题核心在于**str_which是为字符向量设计的,而你传入了列表**——当你把列表传给str_which时,R会自动将列表转换为它的字符串表示(比如第一个列表元素会变成"c(\"street_address\", \"poi\", \"point\")"),这时候你的锚点^poi$是在匹配整个这个长字符串,自然找不到完全等于poi的项;而直接搜poi时,会匹配到这些字符串表示里的poi子串,所以返回了1和2。
要实现“检测列表中存在完全等于poi的元素的向量”这个需求,你可以结合purrr的迭代函数和精确匹配逻辑,有两种简单的方法:
方法1:直接用==做精确匹配(最直观)
这种方法不需要正则表达式,直接检查每个字符向量里是否有元素完全等于目标字符串:
library(purrr) x <- list(c("street_address", "poi", "point"), c("route", "interest", "point_of_interest")) # 找出列表中包含精确"poi"元素的向量索引 which(map_lgl(x, ~ any(.x == "poi")))
运行后会返回[1] 1,符合你的预期——只有第一个向量里有完全匹配的poi。
方法2:用str_detect加锚点(适合复杂正则场景)
如果你一定要用正则锚点,需要对列表里的每个字符向量单独检测,再判断是否有匹配项:
library(stringr) library(purrr) which(map_lgl(x, ~ any(str_detect(.x, "^poi$"))))
同样会返回[1] 1,这里^poi$会精确匹配每个字符向量中完全等于poi的元素,再通过any()判断该向量是否存在这样的元素,最后用which()提取索引。
为什么你之前的写法不生效?
再明确一下:当你执行str_which(x, "^poi$")时,R实际处理的是as.character(x)的结果,也就是:
as.character(x) # [1] "c(\"street_address\", \"poi\", \"point\")" # [2] "c(\"route\", \"interest\", \"point_of_interest\")"
这两个字符串都不是poi,所以^poi$匹配不到任何结果,返回integer(0)。
内容的提问来源于stack exchange,提问作者grssnbchr
相关产品推荐
相关产品推荐

