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_pad
和 str_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"
我有一个这样的字符串列表:
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_pad
和 str_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"