Разделить строку на каждые 5 символов
Предположим, у меня есть длинная строка:
"XOVEWVJIEWNIGOIWENVOIWEWVWEW"
Как я могу разделить это, чтобы получить все 5 символов с последующим пробелом?
"XOVEW VJIEW NIGOI WENVO IWEWV WEW"
обратите внимание, что последний короче.
Я могу сделать цикл, где я постоянно считаю и строю новый символ строки по символу, но, конечно, должно быть что-то лучше нет?
5 ответов
С помощью регулярных выражений:
gsub("(.{5})", "\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"
используя sapply
> string <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
> sapply(seq(from=1, to=nchar(string), by=5), function(i) substr(string, i, i+4))
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"
вы можете попробовать что-то вроде следующего:
s <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW" # Original string
l <- seq(from=5, to=nchar(s), by=5) # Calculate the location where to chop
# Add sentinels 0 (beginning of string) and nchar(s) (end of string)
# and take substrings. (Thanks to @flodel for the condense expression)
mapply(substr, list(s), c(0, l) + 1, c(l, nchar(s)))
выход:
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"
теперь вы можете paste
результирующий вектор (с collapse=' '
) для получения одной строки с пробелами.
вы также можете использовать подстроку без петли. substring
- это векторизованных substr
x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
n <- seq(1, nc <- nchar(x), by = 5)
paste(substring(x, n, c(n[-1]-1, nc)), collapse = " ")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"
нет *применять stringi
устранение:
x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
stri_sub(x, seq(1, stri_length(x),by=5), length=5)
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"
это извлекает подстроки так же, как в ответе @Jilber, но stri_sub
функция векторизована se нам не нужно использовать *apply здесь.