我有一个很长的字符串,我想匹配并用各自的字符数替换单词的某些部分。我尝试使用分组来计算反向引用组的字符,但是当我调用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替换?
答案 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,但是会丢失其副本