【问题标题】:Splitting String based on letters case根据字母大小写拆分字符串
【发布时间】:2011-11-03 00:23:28
【问题描述】:

我想拆分下面的字符串

"ATextIWantToDisplayWithSpaces"

喜欢这个

A Text I Want To Display With Spaces.

我在R中试过这段代码

strsplit(x="ATextIWantToDisplayWithSpaces", split=[:upper:])

产生这个错误

Error: unexpected '[' in "strsplit(x="ATextIWantToDisplayWithSpaces", split=["

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    只要这样做。它的工作原理是 (a) 定位一个大写字母,(b) 将其捕获在一个组中,以及 (c) 用它前面的空格替换它。

    gsub('([[:upper:]])', ' \\1', x)
    

    【讨论】:

    • 太棒了!这是通过删除第一个空格进行的轻微修改:gsub("(?!^)(?=[[:upper:]])", " ", x, perl=T)
    • gsub('([[:upper:]])', ' \\1', x)如果第一个字母是大写,则在开头添加额外的空格,但gsub("(?!^)(?=[[:upper:]])", " ", x, perl=T)不要。
    • 或者这个也没有在开头插入空格:gsub("(.)([[:upper:]])", "\\1 \\2", x)
    • 这也可以通过不匹配边界来防止第一个空格而不需要perl 标志:gsub('\\B([[:upper:]])', ' \\1', x)
    【解决方案2】:

    您的具体问题(“我如何拆分大写字母”?)的答案是

    strsplit(x="ATextIWantToDisplayWithSpaces", split="[[:upper:]]")
    

    但@Ramnath 的答案是您真正想要的。 strsplit 丢弃分割的字符。来自R.utilssplitByPattern 函数更接近,但它仍然不会以最方便的形式返回结果。

    【讨论】:

    • 噢!这次你找我了。 :)
    • @BenBolker:感谢您的回复。 kohske 的评论更灵活。
    • 这回答了具体问题:strsplit(x, "(?!^)(?=[[:upper:]])", perl=T)。 (不过,我想知道为什么这不起作用:strsplit(x, "(?=[[:upper:]])", perl=T)。特别是,为什么它会以这种方式失败?)@kohske——作为本地正则表达式专家,你有什么洞察力?
    【解决方案3】:

    我知道这是一个旧的解决方案,但我将上面的解决方案改编为我需要将数据框中的列的值按大写拆分然后只保留第二个元素的解决方案。此解决方案使用 dplyr 和 purrr:

    df %>% mutate(stringvar= map(strsplit(stringvar, "(?!^)(?=[[:upper:]])", perl=T),~.x[2]) %>% unlist())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2011-05-28
      • 2020-06-05
      • 2022-06-28
      相关资源
      最近更新 更多