如何在R中使用sub对匹配进行数值运算?

时间:2016-11-22 09:33:12

标签: r regex pattern-matching

我想说我想将字符串X0_Y1_Z2更改为X0_Y1_Z1,即将最后一个数字减一。我通过R中的以下陈述尝试了它,它不起作用:

sub("(\\S+_\\S+_)\\S(\\d)", paste0("\\1", as.numeric("\\2")-1), "X0_Y1_Z2", perl=T)

我该怎么做?

1 个答案:

答案 0 :(得分:2)

如果您始终使用相同格式的字符串,并且只有1个最后一位要递减,请使用简单的substring

> paste0(substring(s, 1, nchar(s)-1), as.numeric(substring(s, nchar(s))) - 1)
> [1] "X0_Y1_Z1"

为了匹配字符串中的最后一个数字块,请使用[0-9]+$正则表达式。要增加该值,请使用gsubfn包。查看示例代码:

> library(gsubfn)
> s <- "X0_Y1_Z2"
> gsubfn('[0-9]+$', ~ as.numeric(x)-1, s)
[1] "X0_Y1_Z1"

如果您需要按照您的方式验证字符串,请使用更多组,锚点^$将要求整个字符串与模式匹配(&#34;完整字符串匹配& #34):

> p <- "^(\\S+_\\S+_\\S)(\\d+)$"
> gsubfn(p, function(x1,x2) paste0(x1, as.numeric(x2)-1), s)
[1] "X0_Y1_Z1"