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

