【发布时间】:2020-09-21 07:43:47
【问题描述】:
我有一堆colnames
L_1_3
L_2_23
L_3_91
L_3_16
我想使用 _ 后面的最后一位数字将这些列名替换为新名称,如下所示:
3
23
91
16
我尝试过colnames(X) <- gsub("L_\\d\\d_", "", colnames(X)),它适用于末尾有两位数的字符串。我想要一个同时适用于一位数和两位数的。
谢谢!
【问题讨论】:
我有一堆colnames
L_1_3
L_2_23
L_3_91
L_3_16
我想使用 _ 后面的最后一位数字将这些列名替换为新名称,如下所示:
3
23
91
16
我尝试过colnames(X) <- gsub("L_\\d\\d_", "", colnames(X)),它适用于末尾有两位数的字符串。我想要一个同时适用于一位数和两位数的。
谢谢!
【问题讨论】:
这是一个带有正向预测的选项:
gsub(".+_(?=\\d+$)", "", X, perl = TRUE)
[1] "3" "23" "91" "16"
【讨论】:
如果这是适用于 2 位数字的模式,那么您唯一需要做的就是使用 ? 将其中一个数字设为可选
L_\\d\\d?_
如果您必须匹配整个模式,您可以使用捕获组并使用锚点来断言字符串的开头^ 和结尾$,并在替换中使用组。
^L_\\d\\d?_(\\d+)$
部分
^ 字符串开头 L_ 匹配 L_ \d 匹配一个数字 \d?匹配一个数字并重复 0 或 1 次 _ 匹配 _ (捕获组 1 \d+ 匹配一个数字并重复 1 次或多次 ) 关闭组 $ 字符串结尾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('.*[^[: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')
【讨论】:
"^.*?(\\d+)$" 也可以,不是吗?
我们可以使用str_extract
library(stringr)
str_extract(X, "\\d+$")
#[1] "3" "23" "91" "16"
X <- c("L_1_3", "L_2_23", "L_3_91", "L_3_16")
【讨论】:
尽量保持简单
sub(".*_(\\d+$)", "\\1", X)
[1] "3" "23" "91" "16"
【讨论】:
我认为这可能是最简单的正则表达式:
sub(".*\\_", "", tmp)
【讨论】: