我有一些字符串
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
答案 0 :(得分:5)
不是正则表达式,而是带有strsplit
魔法的rle
和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"
答案 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"