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)