使用包stringi(正则表达式)替换部分字符串

jja*_*iak 2 regex string r stringi

我有一些字符串

string <- "abbccc"
Run Code Online (Sandbox Code Playgroud)

我想把同一个字母的链子替换成一个字母和这封信的出现次数.所以我想要这样的东西: "ab2c3"

我使用stringi包来做到这一点,但它并不像我想要的那样工作.假设我已经有部件的矢量用于替换:

vector <- c("b2", "c3")
stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector)
Run Code Online (Sandbox Code Playgroud)

输出:

[1] "ab2b2" "ac3c3"
Run Code Online (Sandbox Code Playgroud)

我想要的输出: [1] "ab2c3"

我也试过这种方式

stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector, vectorize_all=FALSE)
Run Code Online (Sandbox Code Playgroud)

但我得到错误

Error in stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector, vectorize_all = FALSE) : 
  vector length not consistent with other arguments
Run Code Online (Sandbox Code Playgroud)

Tyl*_*ker 5

不是正则表达式但strsplitrle一些paste魔术:

string <- c("abbccc", "bbaccc", "uffff", "aaabccccddd")

sapply(lapply(strsplit(string, ""), rle), function(x) {
    paste(x[[2]], ifelse(x[[1]] == 1, "", x[[1]]), sep="", collapse="")
})

## [1] "ab2c3"   "b2ac3"   "uf4"     "a3bc4d3"
Run Code Online (Sandbox Code Playgroud)