如何用R语言的stringr包提取最后一个子串后的剩余字符串?
搞定str_match提取最后一个指定子串后的内容
我懂你这种踩坑的感觉,之前要么拿到第一个匹配后的内容,要么直接返回空,确实头疼。其实关键是利用正则的贪婪特性,让它直接定位到最后一次出现的目标子串就行,给你两种靠谱的写法:
方法一:贪婪匹配+捕获组
针对你的示例字符串,直接这么写就能拿到想要的结果:
library(stringr) # 你的目标文本 text <- "apples and oranges and bananas with cream" # 提取最后一次" and "后的内容 result <- str_match(text, ".*(?: and )(.*)")[, 2] print(result) # 输出结果就是:"bananas with cream"
为啥这个能行?
.*:这部分是贪婪匹配,会一股脑儿匹配到**最后一次出现" and "**之前的所有内容,直接跳过前面的那些" and "(?: and ):这是个非捕获组,专门用来定位我们要找的子串,不会把" and "本身提取出来(.*):这是捕获组,专门抓最后一次" and "之后的所有内容,也就是我们要的结果
方法二:正向回顾断言(更简洁)
如果觉得上面的正则有点绕,还可以用正向回顾断言的写法,代码更短:
result <- str_extract(text, "(?<= and ).*$")
这里(?<= and )是告诉正则:“找前面刚好是' and '的位置”,然后.*$匹配从这个位置到字符串结尾的所有内容,同样能精准定位到最后一次匹配后的内容。
特殊情况处理
要是字符串里根本没出现" and ",上面两种写法都会返回NA,如果你想返回原字符串或者空字符串,可以加个简单判断:
# 没匹配到就返回原文本 result <- ifelse(is.na(str_match(text, ".*(?: and )(.*)")[, 2]), text, str_match(text, ".*(?: and )(.*)")[, 2])
内容的提问来源于stack exchange,提问作者James N
相关产品推荐
相关产品推荐

