我想提取第一个下划线(_)
之后的数字,但我不知道为什么只选择1个数字。
我的样本数据是:
myvec<-c("increa_0_1-1","increa_9_25-112","increa_25-50-76" )
as.numeric(gsub("(.*_){1}(\d)_.+", "\2", myvec))
[1] 0 9 NA
Warning message:
NAs introduced by coercion
我想:
[1] 0 9 25
请帮忙吧?
说明一下。我们感兴趣的是_
之后的数字。[0-9]
捕获数字,而+
表示我们想要匹配一行中的任意数字。(?<=_)
"查看"数字后面,并确保我们只捕获前面有_
的数字。
library(stringr)
str_extract(myvec, "(?<=_)[0-9]+")
[1] "0" "9" "25"
另一种可能的解决方案,基于stringr::str_extract
:
library(stringr)
myvec<-c("increa_0_1-1","increa_9_25-112","increa_25-50-76" )
as.numeric(str_extract(myvec, "(?<=_)\d+"))
#> [1] 0 9 25
您可以使用sub
(因为您将需要单个搜索和替换操作)与^[^_]*_(d+).*
:
myvec<-c("increa_0_1-1","increa_9_25-112","increa_25-50-76" )
sub("^[^_]*_(\d+).*", "\1", myvec)
# => [1] "0" "9" "25"
参见R演示和正则表达式演示。
Regex细节:
^
-起始字符串[^_]*
-匹配除_
以外的任何零个或多个字符的否定字符类_
- a_
char(d+)
-组1 (1
指从替换模式中捕获到该组的值):一个或多个数字.*
-字符串的其余部分(.
在TRE正则表达式中默认匹配换行符)。
如果您想提取第一个下划线之后的第一个数字,您可以使用str_match
和模式_([0-9]+)
的捕获组
注意重复字符类(或\d+
)一次或多次。
例如
library(stringr)
myvec<-c("increa_0_1-1","increa_9_25-112","increa_25-50-76" )
str_match(myvec, "_([0-9]+)")[,2]
输出[1] "0" "9" "25"
查看R演示
myvec<-c("increa_0_1-1","increa_9_25-112","increa_25-50-76" )
as.numeric(gsub("[^_]*_(\d+).*", "\1", myvec))
[1] 0 9 25