如何使用stringr提取重复模式中的多个目标数字?
提取年龄数字的几种解决方法
针对你的需求,这里提供三种实用的方法来提取纯年龄数字:
方法1:改进正则表达式(直接提取)
利用正则的正向预查,直接匹配::之后的数字,无需额外处理:
library(tidyverse) ex_str = "0::51||1::40||2::9||3::5||4::2||5::15" str_extract_all(ex_str, "(?<=::)\\d+")
输出结果:
[[1]] [1] "51" "40" "9" "5" "2" "15"
正则说明:(?<=::)是正向预查,确保匹配的数字前面是::,\\d+匹配1个及以上数字。
方法2:分割字符串分步提取
如果对正则不太熟悉,分步分割的方式更直观:
ex_str |> str_split("\\|\\|") |> # 按||拆分每个人员条目 unlist() |> # 把列表转成向量 map_chr(~ str_split_fixed(.x, "::", 2)[,2]) |> # 每个条目按::拆分,取第二部分 as.integer() # 转成整数类型(可选)
输出结果:
[1] 51 40 9 5 2 15
方法3:基于你现有代码的优化
在你已经提取到带::的结果后,直接移除开头的::即可:
str_extract_all(ex_str, "::[0-9]+") |> map(~ str_remove(.x, "^::")) |> # 移除每个字符串开头的:: map(as.integer) # 转成整数(可选)
内容的提问来源于stack exchange,提问作者Vanessa
相关产品推荐
相关产品推荐

