Замените части строки с помощью пакета 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
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