R语言中使用stringr::str_extract提取所有“banana+单词”匹配项的问题
解决stringr只提取第一个"banana + 单词"匹配的问题
你遇到的问题很典型——str_extract()默认只会返回每个字符串里的第一个匹配项,所以第一个长字符串里的"banana split"就被漏掉了。要拿到所有符合要求的匹配,我们需要换用str_extract_all(),再调整一下正则表达式的写法,就能得到你想要的结果。
解决方案代码
library(stringr) library(purrr) # 用来扁平化列表结果 all_terms <- c("banana word2 word3 word4 banana split word2 word3 word4", "x y z", "banana ice cream") # 提取所有"banana + 单词"的匹配项 banana_terms <- all_terms %>% str_extract_all("banana\\s+\\w+") %>% flatten_chr() # 查看结果 banana_terms
运行这段代码后,输出就是你期望的:
[1] "banana word2" "banana split" "banana ice"
关键步骤解释
- 用
str_extract_all()替代str_extract():这个函数会提取每个字符串中所有符合正则规则的匹配项,默认返回一个列表(每个元素对应原向量的一个字符串的匹配结果)。 - 调整正则表达式:
"banana\\s+\\w+"专门匹配"banana"后面跟着一个或多个空白字符,再跟一个完整单词(\\w+匹配字母、数字和下划线;如果你的"单词"包含特殊字符比如连字符,可以换成\\S+匹配任意非空白字符)。 - 扁平化列表结果:用
flatten_chr()把列表转成一维字符向量,自动忽略那些没有匹配结果的元素(比如第二个字符串"x y z"就不会产生任何输出)。
为什么原来的代码不行?
你原来的str_extract("banana.+")会匹配从第一个"banana"开始到字符串结尾的所有内容,再用word(1,2)只能截取前两个单词,自然抓不到后面的"banana split"啦。
内容的提问来源于stack exchange,提问作者jvqp
相关产品推荐
相关产品推荐

