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

R stringr如何提取years前两位数字及years后7-8位数字(跳过中间字符)

解决方案

你可以直接使用带惰性匹配的正则结合str_match_all同时提取years前后的目标数字,也可以单独提取后续的7-8位数字,代码如下:

library(stringr)
# 示例数据
data <- "mr john is 45 years old his number is 12345678, mr doe is 57 years 7654321"

# 方案1:同时提取years前的两位年龄、years后的7-8位数字
match_res <- str_match_all(data, "(\\d{2})\\s+years.*?(\\d{7,8})")[[1]]
age_list <- match_res[,2] # 输出:"45" "57"
num_list <- match_res[,3] # 输出:"12345678" "7654321"

# 方案2:仅提取years后的7-8位数字
only_num <- str_extract_all(data, "(?<=years.*?)\\d{7,8}")[[1]]

正则逻辑说明

  • 原来的代码中用单个.匹配字符,仅能匹配1个任意字符,所以当years和目标数字之间存在多个其他字符时无法匹配。我们替换为.*?惰性匹配符,会尽可能短的匹配中间的任意字符,直到碰到第一个符合要求的7-8位数字,不会出现跨结果匹配的问题。
  • 你之前的正则里写的(?:year)只能匹配单数的year,需要改成years才能匹配你样本里的表述。
  • 方案2中用到了可变长度后视断言(?<=years.*?),可以在匹配到years加任意中间字符后,直接返回后面的7-8位数字,不需要额外提取分组。

内容的提问来源于stack exchange,提问作者Dite Bayu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:07