用字符数替换字符串中单词的一部分

时间:2018-02-16 14:48:08

标签: r regex

我有一个很长的字符串,我想匹配并用各自的字符数替换单词的某些部分。我尝试使用分组来计算反向引用组的字符,但是当我调用nchar时,它无法识别反向引用。

    gsub("\\b([a-z])([a-z]{1,})([a-z])",paste0("\\1",nchar("\\2"),"\\3"),"this is a test string")
    [1] "t2s is a t2t s2g"

我想得到答案:

    [1] "t2s is a t2t s4g"

有没有办法计算组中的字符数并使用gsub替换?

2 个答案:

答案 0 :(得分:3)

您可以使用gsubfn来操作捕获组:

> library(gsubfn)
> gsubfn("\\y([a-z])([a-z]+)([a-z])", function(x,y,z) paste0(x,nchar(y),z),"this is a test string")
[1] "t2s is a t2t s4g"

请注意,\y是Tcl正则表达式模式中的单词边界(相当于\b)(gsubfn默认使用Tcl正则表达式库)。您也可以使用perl=TRUE来使用\b

> gsubfn("\\b([a-z])([a-z]+)([a-z])", function(x,y,z) paste0(x,nchar(y),z),"this is a test string", perl=TRUE)
[1] "t2s is a t2t s4g"

请注意,捕获组值通过x(= \1),y(= \2)和z传递给非正规替换函数(= \3)。

答案 1 :(得分:1)

在基地R中,您可以执行以下操作:

x="This is a test string"
x=y
regmatches(y,b)<-Map(attr,b<-gregexpr("\\B([a-z]+)\\B",x),"match.length")
y
[1] "t2s is a t2t s4g"

您可以决定直接替换x,但是会丢失其副本