R 如何使用正则表达式提取字符串的最后数字?
我有很多名字R 如何使用正则表达式提取字符串的最后数字?,r,regex,replace,names,R,Regex,Replace,Names,我有很多名字 L_1_3 L_2_23 L_3_91 L_3_16 我想用新名称替换这些colname,使用uu后面的最后一位数字,如下所示: 3 23 91 16 我试过colnames(X)这里有一个正则表达式可以实现这一点。 它获取任何内容,直到一个非数字后跟一个或多个数字的捕获组。并由捕获组替换 sub('.*[^[:digit:]]{1}([[:digit:]]+$)', '\\1', x) #[1] "3" "23" "91" "16" 适用于一位数和两位数但不多也不少的正则
L_1_3
L_2_23
L_3_91
L_3_16
我想用新名称替换这些colname,使用uu后面的最后一位数字,如下所示:
3
23
91
16
我试过
colnames(X)这里有一个正则表达式可以实现这一点。
它获取任何内容,直到一个非数字后跟一个或多个数字的捕获组。并由捕获组替换
sub('.*[^[:digit:]]{1}([[:digit:]]+$)', '\\1', x)
#[1] "3" "23" "91" "16"
适用于一位数和两位数但不多也不少的正则表达式将是
sub('.*[^[:digit:]]{1}([[:digit:]]{1,2}$)', '\\1', x)
#[1] "3" "23" "91" "16"
数据
x <- scan(what = character(), text = '
L_1_3
L_2_23
L_3_91
L_3_16')
x这里有一个具有积极前瞻性的选项:
gsub(".+_(?=\\d+$)", "", X, perl = TRUE)
[1] "3" "23" "91" "16"
尽量使它简单
sub(".*_(\\d+$)", "\\1", X)
[1] "3" "23" "91" "16"
我们可以使用str\u extract
library(stringr)
str_extract(X, "\\d+$")
#[1] "3" "23" "91" "16"
数据
X如果这是适用于2位数字的模式,您唯一需要做的就是使用?
L_\\d\\d?_
|
如果必须匹配整个模式,则可以使用捕获组并使用锚来断言字符串的开始^
和结束$
,并在替换中使用组
^L_\\d\\d?_(\\d+)$
部分地
我认为这可能是最简单的正则表达式:
sub(".*\\_", "", tmp)
我认为“^.*?(\\d+)$”
同样有效,不是吗?@AllanCameron是的,作为答案发布,我会投赞成票。它比我的好多了。
^ Start of string
L_ Match L_
\d Match a digit
\d? Match a digit and repeat 0 or 1 times
_ Match _
( Capture group 1
\d+ Match a digit and repeat 1 or more times
) Close group
$ End of string
X <- c("L_1_3", "L_2_23", "L_3_91", "L_3_16")
gsub("^L_\\d\\d?_(\\d+)$", "\\1", X)
[1] "3" "23" "91" "16"
sub(".*\\_", "", tmp)