给出如下字符串:
text <- "abcdefghijklmnopqrstuvwxyz"
我想将字符串剪切成子字符串,例如长度为10,并保留余数:
"abcdefghij"
"klmnopqrst"
"uvwxyz"
我知道创建子串的所有方法都不会给我6个字符的余数子串。我尝试过以前类似问题的答案,例如:
> substring(text, seq(1, nchar(text), 10), seq(10, nchar(text), 10))
[1] "abcdefghij" "klmnopqrst" ""
关于如何获得所需长度和任何剩余字符串的所有子串的任何建议都将非常感激。
答案 0 :(得分:10)
尝试
strsplit(text, '(?<=.{10})', perl=TRUE)[[1]]
#[1] "abcdefghij" "klmnopqrst" "uvwxyz"
或者您可以使用library(stringi)
更快的方法
library(stringi)
stri_extract_all_regex(text, '.{1,10}')[[1]]
#[1] "abcdefghij" "klmnopqrst" "uvwxyz"
答案 1 :(得分:8)
用于first
中last
和substring
参数的向量可能超过字符串中的字符数而没有错误/警告/问题。所以你可以做到
text <- "abcdefghijklmnopqrstuvwxyz"
sq <- seq.int(to = nchar(text), by = 10)
substring(text, sq, sq + 9)
# [1] "abcdefghij" "klmnopqrst" "uvwxyz"
答案 2 :(得分:3)
这是一种使用strapplyc
涉及一个相当简单的正则表达式的方法。它有效,因为.{1,10}
总是匹配不超过10个字符的最长字符串:
library(gsubfn)
strapplyc(text, ".{1,10}", simplify = c)
,并提供:
[1] "abcdefghij" "klmnopqrst" "uvwxyz"
可视化这个正则表达式非常简单,它实际上并不需要可视化,但这里有一个:
.{1,10}