【问题标题】:Split a string every 5 characters每 5 个字符拆分一个字符串
【发布时间】:2014-12-17 07:41:21
【问题描述】:

假设我有一个长字符串:

"XOVEWVJIEWNIGOIWENVOIWEWVWEW"

如何拆分它以获得每 5 个字符后跟一个空格?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW"

请注意,最后一个较短。

我可以做一个循环,我不断地计算并逐个字符地构建一个新的字符串,但肯定有更好的东西不是吗?

【问题讨论】:

标签: r string split string-split


【解决方案1】:

您可以尝试以下方法:

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=' ')来获得带有空格的单个字符串。

【讨论】:

  • 应该是粘贴和折叠我认为
  • 这看起来很棒,我可以从这里粘贴和折叠。但是您介意对 mapply 的工作原理提供一些见解吗?谢谢!
  • @user1357015 添加了一些 cmets。
【解决方案2】:

使用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"  

【讨论】:

    【解决方案3】:

    使用正则表达式:

    gsub("(.{5})", "\\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW")
    # [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"
    

    【讨论】:

    • @flodel,你能帮忙解释一下“\\1”吗?我已经弄清楚了其他所有事情,但这让我很困惑
    • @user1357015 我认为 hwnd 在这里解释了这个想法做得很好:stackoverflow.com/a/26495062/1000343
    • 这太棒了,而且超级快:)
    • 有什么办法可以扭转这种局面?例如,您将如何从右侧开始向左移动?另外,不是用 5 分割,而是说我想要前 8 个字符和后 6 个字符分开,所以它看起来像:` "XOVEWVJI EWNIGOIWENVOIW EWVWEW" `
    【解决方案4】:

    您也可以使用不带循环的子字符串。 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"
    

    【讨论】:

      【解决方案5】:

      否 *apply 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 函数是矢量化的,我们不需要在这里使用 *apply。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2011-05-07
        • 2012-03-17
        • 1970-01-01
        相关资源
        最近更新 更多