Замените части строки с помощью пакета stringi (regex)



У меня есть строка



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
535   2  

2 ответов:

Не регулярное выражение, а 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"

Не является решением stringi и не является решением regex, но вы можете сделать это, разделив строку и используя rle:

    string <- "abbccc"
    res<-paste(collapse="",do.call(paste0,rle(strsplit(string,"",fixed=TRUE)[[1]])[2:1]))
    gsub("1","",res)
    #[1] "ab2c3"

Comments

    Ничего не найдено.