У меня есть текстовая строка, которую я хотел бы преобразовать из
text = "end back@drive@o correct back@drive@adjust@cats@do to tok"
to
"end back@drive drive@o correct back@drive drive@adjust adjust@cats cats@do to tok"
Скорее вообще хочу заменить
"a@b@c" with "a@b b@c"
"a@b@c@d" with "a@b b@c c@d"
и так далее. В моей попытке ниже используется пакет stringr
.
patterns = unlist(str_extract_all(text, "([[:alnum:]]+@){2,}[[:alnum:]]+"))
replacements = strsplit(patterns, "@")
replacements = lapply(replacements, function(y) {
pretuples = y[-length(y)]
posttuples = y[-1]
paste(paste0(pretuples, "@", posttuples), collapse = " ")
})
replacements = do.call(c, replacements)
str_replace_all(text, pattern = patterns, replacement = replacements)
Я не думаю, что str_replace_all
- это функция, которую я ищу в конце, и, конечно, она (разумно) возвращает
[1] "end back@drive drive@o correct back@drive@adjust to tok"
[2] "end back@drive@o correct back@drive drive@adjust adjust@cats cats@do to tok"
Может ли кто-нибудь помочь мне разобраться в этом?
Спасибо большое.
РЕДАКТИРОВАТЬ: ответы до сих пор были невероятно полезными, но это большой файл, который я разбираю и действительно не знаю, сколько раз этот шаблон a@b@c@d...
будет связан. Есть ли более общее решение, которое не полагается на жесткое кодирование длины шаблона (как я пробовал выше)?