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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:22:44