R:将字符添加到字符串中的特定位置,正则表达式语法有问题

R: add a character to a specific spot in string, trouble with regex syntax

我有一个这样的字符串列表: batch1, batch2, batch3, batch10, batch11

我想在个位数前加一个0batch01, batch02, batch03, batch10, batch11

我发现了很多类似的问题,并尝试编写自己的正则表达式。我已经很接近了,但我不能完全让它做我想做的事。

Batch <- gsub('(.{5})([0-9]{1}\b)','\10\2', Batch) 输出 batch01, batch02, batch 03, batch100, batch110

\s 而不是 \b 不会改变任何值

sampleNames$Batch <- gsub('(.{5})([0-9]{1})','\10\2', sampleNames$Batch) 输出 bacth01, batch02, batch03, batch010, batch011

我试过其他几个版本,但似乎无法正确理解。我知道这是一个有点重复的问题,但我无法更改以前的解决方案来完成我需要做的事情。

我们可以将最后一个数字和它前面的小写字母捕获为两个组,然后在替换中指定组的反向引用和中间的 0。因此,它不会匹配字符串末尾有两个数字的那些

sub("([a-z])(\d)$", "\10\2", Batch)
[1] "batch01" "batch02" "batch03" "batch10" "batch11"

或者我们可以使用 sprintf/str_padstr_replace

library(stringr)
str_replace(Batch, "\d+$", function(x) sprintf("%02d", as.numeric(x)))
[1] "batch01" "batch02" "batch03" "batch10" "batch11"

数据

Batch <- c("batch1", "batch2", "batch3", "batch10", "batch11")

使用

sampleNames$Batch <- sub("(\D|^)(\d)$", "\10\2", sampleNames$Batch, perl=TRUE)

参见regex proof

解释

--------------------------------------------------------------------------------
  (                        group and capture to :
--------------------------------------------------------------------------------
    \D                       non-digits (all but 0-9)
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    ^                        the beginning of the string
--------------------------------------------------------------------------------
  )                        end of 
--------------------------------------------------------------------------------
  (                        group and capture to :
--------------------------------------------------------------------------------
    \d                       digits (0-9)
--------------------------------------------------------------------------------
  )                        end of 
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

您也可以使用以下解决方案:

sapply(vec, function(x) {
  d <- gsub("([[:alpha:]]+)(\d)", "\2", x)
  if(nchar(d) == 1) {
    gsub("([[:alpha:]]+)(\d)", "\10\2", x)
  } else {
    x
  }
})

   batch1    batch2    batch3   batch10   batch11 
"batch01" "batch02" "batch03" "batch10" "batch11"