【问题标题】:Split string into substrings of given length with remainder将字符串拆分为具有余数的给定长度的子字符串
【发布时间】:2015-02-13 22:27:02
【问题描述】:

给定一个字符串,例如:

text <- "abcdefghijklmnopqrstuvwxyz"

我想将字符串切成子串,例如长度为10,并保留其余部分:

"abcdefghij"
"klmnopqrst"
"uvwxyz"

我知道的所有创建子字符串的方法都不会给我剩下的 6 个字符的子字符串。我已经尝试过以前类似问题的答案,例如:

> substring(text, seq(1, nchar(text), 10), seq(10, nchar(text), 10))
[1] "abcdefghij" "klmnopqrst" ""  

任何关于如何获得所需长度的所有子字符串和任何剩余字符串的建议将不胜感激。

【问题讨论】:

    标签: r string substring string-split


    【解决方案1】:

    试试

    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"    
    

    【讨论】:

    • 感谢您的建议;这种方法对我也很有效。我是否正确地推测这是使用 perl 正则表达式来查找:满足条件(即:任何字符)小于或等于 10 次的字符串?
    • 它使用 perl lookbehind (?&lt;=.{10}) 断言紧接在字符串当前位置之前的是任意十个字符 .{10}
    【解决方案2】:

    用于substring 中的firstlast 参数的向量可以超过字符串中的字符数而不会出现错误/警告/问题。所以你可以做

    text <- "abcdefghijklmnopqrstuvwxyz"
    
    sq <- seq.int(to = nchar(text), by = 10)
    substring(text, sq, sq + 9)
    # [1] "abcdefghij" "klmnopqrst" "uvwxyz"   
    

    【讨论】:

    • 谢谢 - 这可以完成。正如您所指出的,我的错误是如果序列试图超出字符串长度,则该序列终止。
    【解决方案3】:

    这是一种使用strapplyc 的方法,涉及一个相当简单的正则表达式。它之所以有效,是因为.{1,10} 总是匹配不超过 10 个字符的最长字符串:

    library(gsubfn)
    strapplyc(text, ".{1,10}", simplify = c)
    

    给予:

    [1] "abcdefghij" "klmnopqrst" "uvwxyz"
    

    可视化 这个正则表达式很简单,它实际上不需要可视化,但无论如何这里有一个:

    .{1,10}
    

    Debuggex Demo

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多