R语言stringr包中str_extract_all为何未返回全部匹配结果?
问题
我有如下字符串:
string <- "Apples/Bananas/Grapes/"
我尝试用以下模式匹配所有可能的子串:
pattern <- "Apples/Bananas/|Bananas/Grapes/|Grapes/|Grapes/Pears/"
预期输出为:
"Apples/Bananas/" "Bananas/Grapes/" "Grapes/"
我使用str_extract_all函数执行匹配:
matches <- str_extract_all(string, pattern)
但仅得到结果:
"Apples/Bananas/" "Grapes/"
为什么该函数未返回"Bananas/Grapes/"?
原因与解决办法
这是因为str_extract_all默认是非重叠匹配:当第一个模式Apples/Bananas/匹配成功后,它会跳过这段已匹配的内容,从Bananas/之后的位置继续查找。此时剩下的字符串只有Grapes/,自然匹配不到Bananas/Grapes/——前面的Bananas/已经被第一个匹配“消耗”掉了。
要获取所有重叠的匹配结果,需要用**正向预查(lookahead)**改写正则模式,让匹配过程不消耗字符串内容。具体操作是把每个要匹配的子模式包裹在(?=...)中,这样程序只会检查当前位置是否符合模式,不会移动匹配指针,后续模式仍能从同一位置开始匹配。
修改后的模式及执行代码:
# 改写模式,用正向预查包裹每个子模式并捕获内容 pattern <- "(?=(Apples/Bananas/))|(?=(Bananas/Grapes/))|(?=(Grapes/))|(?=(Grapes/Pears/))" # 执行提取并过滤空字符串 matches <- str_extract_all(string, pattern) %>% unlist() %>% .[. != ""]
执行后就能得到预期结果:
"Apples/Bananas/" "Bananas/Grapes/" "Grapes/"
内容的提问来源于stack exchange,提问作者gurt
相关产品推荐
相关产品推荐

