Regex 如何根据要修改的符号数修改R中的字符串

Regex 如何根据要修改的符号数修改R中的字符串,regex,r,Regex,R,这个问题很容易理解,但我不知道该如何解决。假设我有一个向量,我想修改它,使它的末尾有5个整数,缺失的数字替换为零: Smth1 Smth00001 Smth22 Smth00022 Smth333 Smth00333 Smth4444 Smth04444 Smth55555 Smth55555 我想可以使用regex和gsub等函数来完成,但我不知道如何考虑替换字符串的长度 下面是使用stringi的一个想法: 以下是使用stringr库的解决方案: 以下是使用string

这个问题很容易理解,但我不知道该如何解决。假设我有一个向量,我想修改它,使它的末尾有5个整数,缺失的数字替换为零:

Smth1     Smth00001
Smth22    Smth00022
Smth333   Smth00333
Smth4444  Smth04444
Smth55555 Smth55555
我想可以使用regex和gsub等函数来完成,但我不知道如何考虑替换字符串的长度

下面是使用stringi的一个想法:


以下是使用stringr库的解决方案:


以下是使用stringr库的解决方案:


使用base R。其他人可以美化正则表达式:

sprintf("%s%05d", gsub("^([^0-9]+)..*$", "\\1", x),
  as.numeric(gsub("^..*[^0-9]([0-9]+)$", "\\1", x)))

[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555"

使用base R。其他人可以美化正则表达式:

sprintf("%s%05d", gsub("^([^0-9]+)..*$", "\\1", x),
  as.numeric(gsub("^..*[^0-9]([0-9]+)$", "\\1", x)))

[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555"

下面是一个简单的单线解决方案,类似于但在使用gsubfn库的gsubfn中使用替换回调方法:

在哪里

^-字符串的开头 [^0-9]+\\K-匹配1+个非数字符号,\K将忽略它们 [0-9]+-传递给回调的组1 $-字符串的结尾。
下面是一个简单的单线解决方案,类似于但在使用gsubfn库的gsubfn中使用替换回调方法:

在哪里

^-字符串的开头 [^0-9]+\\K-匹配1+个非数字符号,\K将忽略它们 [0-9]+-传递给回调的组1 $-字符串的结尾。
仅供参考,此解决方案是目前唯一使用1个正则表达式匹配操作的解决方案。我不知道为什么我们都被否决。非常优雅的解决方案BTW+1FYI,这个解决方案是目前唯一使用1个正则表达式匹配操作的解决方案。我不知道为什么我们都被否决。非常优雅的解决方案BTW+1这与我使用stringi的解决方案有何不同?这与我使用stringi的解决方案有何不同?不完全是,dww。一个人从stringr那里提出了Stru_pad,它确实解决了这个问题,尽管这个人问到了smth elsenot,真的,dww。一个人从stringr那里提出了Stru_pad,它确实解决了这个问题,尽管这个人问了smth的其他问题
library(stringr)
library(dplyr)

num <- str_extract(v, "[1-9]+")
padding <- 9 - nchar(num)
ouput <- paste0(str_extract(v, "[^0-9]+") %>% 
                str_pad(width = padding, side = c("right"), pad = "0"), num)
"Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555"
sprintf("%s%05d", gsub("^([^0-9]+)..*$", "\\1", x),
  as.numeric(gsub("^..*[^0-9]([0-9]+)$", "\\1", x)))

[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555"
> library(gsubfn)
> v <- c("Smth1", "Smth22", "Smth333", "Smth4444", "Smth55555")
> gsubfn('[0-9]+$', ~ sprintf("%05d",as.numeric(x)), v)
[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555"
> gsubfn('^[^0-9]+\\K([0-9]+)$', ~ sprintf("%05d",as.numeric(x)), v, perl=TRUE)
[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555"
library(stringr)
paste0(str_extract(v,'\\D+'),str_pad(str_extract(v,'\\d+'),5,'left', '0'))
#[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555"