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
相关产品推荐
相关产品推荐

