Applying a function to a backreference within gsub in R

佐手、 提交于 2019-11-28 05:32:49

问题


I'm new to R and am stuck with backreferencing that doesn't seem to work. In:

gsub("\\((\\d+)\\)", f("\\1"), string)

It correctly grabs the number in between parentheses but doesn't apply the (correctly defined, working otherwise) function f to replace the number --> it's actually the string "\1" that passes through to f.

Am I missing something or is it just that R does not handle this? If so, any idea how I could do something similar, i.e. applying a function "on the fly" to the (actually many) numbers that occur in between parentheses in the text I'm parsing?

Thanks a lot for your help.


回答1:


R does not have the option of applying a function directly to a match via gsub. You'll actually have to extract the match, transform the value, then replace the value. This is relativaly easy with the regmatches function. For example

x<-"(990283)M (31)O (29)M (6360)M"

f<-function(x) {
    v<-as.numeric(substr(x,2,nchar(x)-1))
    paste0(v+5,".1")
}

m <- gregexpr("\\(\\d+\\)", x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
# [1] "990288.1M 36.1O 34.1M 6365.1M"

Of course you can make f do whatever you like just make sure it's vector-friendly. Of course, you could wrap this in your own function

gsubf <- function(pattern, x, f) {
    m <- gregexpr(pattern, x)
    regmatches(x, m) <- lapply(regmatches(x, m), f)
    x   
}
gsubf("\\(\\d+\\)", x, f)

Note that in these examples we're not using a capture group, we're just grabbing the entire match. There are ways to extract the capture groups but they are a bit messier. If you wanted to provide an example where such an extraction is required, I might be able to come up with something fancier.




回答2:


This is for multiple different replacements.

text="foo(200) (300)bar (400)foo (500)bar (600)foo (700)bar"

f=function(x)
{
  return(as.numeric(x[[1]])+5)
}
a=strsplit(text,"\\(\\K\\d+",perl=T)[[1]]

b=f(str_extract_all(text,perl("\\(\\K\\d+")))

paste0(paste0(a[-length(a)],b,collapse=""),a[length(a)])  #final output
#[1] "foo(205) (305)bar (405)foo (505)bar (605)foo (705)bar"


来源:https://stackoverflow.com/questions/25506540/applying-a-function-to-a-backreference-within-gsub-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!