【问题标题】:strsplit on first instance [duplicate]第一个实例上的strsplit [重复]
【发布时间】:2014-10-07 22:08:53
【问题描述】:

我想写一个strsplit命令,抓取第一个“)”并分割字符串。

例如:

f("12)34)56")
"12" "34)56"

我已经阅读了其他几个相关的正则表达式 SO 问题,但恐怕我无法对此做出正面或反面。感谢您的帮助。

【问题讨论】:

    标签: regex r strsplit


    【解决方案1】:

    如果您使用regexpr 获得第一个匹配项,然后使用regmatches 的反转结果,您可以获得与strsplit 相同的列表类型结果。

    x <- "12)34)56"
    regmatches(x, regexpr(")", x), invert = TRUE)
    # [[1]]
    # [1] "12"    "34)56"
    

    【讨论】:

      【解决方案2】:

      需要速度吗?然后去stringi函数。参见时间,例如here.

      library(stringi)
      x <- "12)34)56"
      stri_split_fixed(str = x, pattern = ")", n = 2)
      

      【讨论】:

        【解决方案3】:

        识别字符的位置然后在其任一侧子串可能会更安全:

        x <- "12)34)56"
        spl <- regexpr(")",x)
        substring(x,c(1,spl+1),c(spl-1,nchar(x)))
        #[1] "12"    "34)56"
        

        【讨论】:

          【解决方案4】:

          另一种选择是在包stringr中使用str_split

          library(stringr)
          f <- function(string)
          {
            unlist(str_split(string,"\\)",n=2))
          }
          > f("12)34)56")
          [1] "12"    "34)56"
          

          【讨论】:

            【解决方案5】:

            将第一个( 替换为非打印字符"\01",然后对其进行strsplit。您可以使用任何您喜欢的字符代替"\01",只要它不出现即可。

            strsplit(sub(")", "\01", "12)34)56"), "\01")
            

            【讨论】:

            • 感谢您的建议,但这很危险,因为通常) 之前可能有一个逗号,例如strsplit(sub(")", ",", ",12)34)56"), ",")
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-08
            • 1970-01-01
            • 2016-03-24
            • 2017-08-12
            • 1970-01-01
            • 2020-05-11
            相关资源
            最近更新 更多