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

R语言如何提取字符串第一个下划线后的所有数字值

问题根因

你写的正则有两个明显问题:

  • 数字匹配部分用了\\d,仅能匹配单个数字位,遇到25这种多位数字只能抓到第一位
  • 规则里强制要求匹配到的数字后面必须跟一个下划线_,但第三个测试字符串increa_25-50-76里,第一个下划线后的25后面直接是连字符,根本满足不了匹配条件,所以替换时没命中规则,返回原字符串转数值就出了NA。

修正代码

直接用sub做单次匹配替换就行,不需要写复杂的重复分组:

myvec <- c("increa_0_1-1","increa_9_25-112","increa_25-50-76" )
as.numeric(sub("^[^_]+_(\\d+).*", "\\1", myvec))

运行输出:

[1]  0  9 25

完全符合你的预期。

正则逻辑说明

  • ^[^_]+_:从字符串开头开始匹配,一直到第一个下划线为止,精准锚定第一个下划线的位置,不会误匹配到后面的下划线
  • (\\d+):捕获第一个下划线后连续的1个及以上数字,就是你要提取的目标值,不管是1位还是多位数字都能匹配到
  • .*:匹配数字后面剩下的所有内容
  • 替换时只保留捕获到的数字分组,直接拿到结果。

如果你习惯用提取类函数,也可以用stringr的写法,逻辑更直白:

library(stringr)
as.numeric(str_extract(myvec, "(?<=_)\\d+"))

这里用正向零宽断言(?<=_)定位下划线位置,正则默认从左向右匹配,会自动取第一个下划线后的连续数字,结果和上面完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:21:32