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

时间:2014-11-29 17:12:57

标签: regex r string stringi

我有一些字符串

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

2 个答案:

答案 0 :(得分:5)

不是正则表达式,而是带有strsplit魔法的rlepaste

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"

答案 1 :(得分: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"