regex 将反向引用与数字分开

wmvff8tz  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(128)

在R下,我试图将字符串中的字母和数字分开,以便在数字小于10(一位数)时添加0。
范例:

my_strings=c("GIR1", "GIR20", "GIR3ABC")

最后,我希望我的字符串=“GIR01”,“GIR 20”,“GIR03ABC”
所以我试着:

result=gsub("([A-Z]*)([1-9]{1})([A-Z]*)", "\\1Z\\2\\3",my_strings)

但我有两个问题
第一个:它不选择只有一个数字的字符串(它选择所有),即使我指定了{1},第二个问题是,我想要一个0,而不是我在替换字符串中写的Z,但是,它变成了\\10。有谁知道如何区分1和0?
谢谢你

0vvn1miw

0vvn1miw1#

gsubfn类似于gsub,不同之处在于替换字符串可以是一个替换函数,该函数输入匹配,用该函数的输出替换它。这个函数可以用普通的方法来指定,也可以用我们这里使用的公式表示法来指定。因此,这个一行程序可以使用简单的正则表达式。

library (gsubfn)

gsubfn("\\d+", ~ if (nchar(x) == 1) paste0(0, x) else x, my_strings)
## [1] "GIR01"    "GIR20"    "GIR03ABC"

这也适用

gsubfn("\\d+", ~ sprintf("%02d", as.numeric(x)), my_strings)
## [1] "GIR01"    "GIR20"    "GIR03ABC"

注意事项

问题的输入

my_strings <- c("GIR1", "GIR20", "GIR3ABC")
8tntrjer

8tntrjer2#

我们可以使用gregexpr来识别数字,使用regmatches来提取并重新分配回字符串。

my_strings <- c("GIR1", "GIR20", "GIR3ABC")
gre <- gregexpr("\\d+", my_strings)

regmatches(my_strings, gre)
# [[1]]
# [1] "1"
# [[2]]
# [1] "20"
# [[3]]
# [1] "3"
regmatches(my_strings, gre) <- sprintf("%02d", as.integer(unlist(regmatches(my_strings, gre))))
my_strings
# [1] "GIR01"    "GIR20"    "GIR03ABC"
nwlqm0z1

nwlqm0z13#

我们可以首先提取字符串中的整数,用零填充它,然后用零填充的整数替换原始整数。

library(stringr)

my_strings=c("GIR1", "GIR20", "GIR3ABC")

str_replace(my_strings, "\\d+", str_pad(gsub("[^0-9]", "", my_strings), 2, pad = "0"))
#> [1] "GIR01"    "GIR20"    "GIR03ABC"

创建于2023-09-06附带reprex v2.0.2

tyu7yeag

tyu7yeag4#

您可以使用

gsub("(?<!\\d)([1-9])(?!\\d)", "0\\1",my_strings, perl=TRUE)

参见regex demoR demo online

my_strings=c("GIR1", "GIR20", "GIR3ABC")
gsub("(?<!\\d)([1-9])(?!\\d)", "0\\1",my_strings, perl=TRUE)
## [1] "GIR01"    "GIR20"    "GIR03ABC"

(?<!\d)([1-9])(?!\d)正则表达式匹配

  • (?<!\d)-前面没有数字的位置
  • ([1-9])-第1组(\1):从19的数字
  • (?!\d)-一个不紧跟数字的位置。

注意perl=TRUE的使用,因为正则表达式包含本机基础R TRE正则表达式引擎不支持的查找。

相关问题