2

我有一些字符串

string <- "abbccc"

我想将同一字母的链替换为一个字母和该字母的出现次数。所以我想要这样的东西: "ab2c3"

我使用stringi包来做到这一点,但它并不像我想要的那样工作。假设我已经有了带有替换零件的向量:

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

输出:

[1] "ab2b2" "ac3c3"

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

我也试过这种方式

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

但我得到错误

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

2 回答 2

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"
于 2014-11-29T21:40:35.697 回答
3

不是stringi解决方案,也不regex是,但是您可以通过拆分字符串并使用来做到这一点rle

    string <- "abbccc"
    res<-paste(collapse="",do.call(paste0,rle(strsplit(string,"",fixed=TRUE)[[1]])[2:1]))
    gsub("1","",res)
    #[1] "ab2c3"
于 2014-11-29T17:50:26.210 回答