【问题标题】:R splitting string on predefined locationR在预定义位置拆分字符串
【发布时间】:2024-04-13 11:55:02
【问题描述】:

我有字符串,应该从“随机”位置分成几部分。拆分总是从冒号后的下一个逗号开始。

我的想法是找到冒号

stringr::str_locate_all(test, ":") %>% 
  unlist()

然后找到逗号

stringr::str_locate_all(test, ",") %>% 
  unlist()

并从那里找出应该拆分的位置,但找不到合适的方法。感觉冒号后逗号前总是有 6 个字符,但我不能确定整个数据的情况。

这是示例字符串:

dput(test)
"AA,KK,QQ,JJ,TT,99,88:0.5083,66,55:0.8303,AK,AQ,AJs,AJo:0.9037,ATs:0.0024,ATo:0.5678"

这是应该的结果

dput(result)
c("AA,KK,QQ,JJ,TT,99,88:0.5083", "66,55:0.8303", "AK,AQ,AJs,AJo:0.9037", 
"ATs:0.0024", "ATo:0.5678")

【问题讨论】:

    标签: r regex string split


    【解决方案1】:

    也许我们可以像下面这样使用regmatches

    > regmatches(test, gregexpr("(\\w+,?)+:[0-9.]+", test))[[1]]
    [1] "AA,KK,QQ,JJ,TT,99,88:0.5083" "66,55:0.8303"
    [3] "AK,AQ,AJs,AJo:0.9037"        "ATs:0.0024"
    [5] "ATo:0.5678"
    

    【讨论】:

      【解决方案2】:

      这里有一个带有 strsplit 的选项 - 将数字后面的 , 替换为 . 和一个或多个数字 (\\d+) 与使用 gsub 的新分隔符,然后用 @987654326 拆分@在base R

      result1 <- strsplit(gsub("([0-9]\\.[0-9]+),", "\\1;", test), ";")[[1]]
      

      -检查

      > identical(result, result1)
      [1] TRUE
      

      如果字符数是固定的,请使用正则表达式查找

      result1 <-  strsplit(test, "(?<=:.{6}),", perl = TRUE)[[1]]
      

      【讨论】:

      • 第一个看起来很不安全,根本不依赖冒号
      • 正如 OP 提到的,如果有不适合的情况,第二个也可能失败。所以,任何正则表达式模式都有同样的问题
      • 嗯,不是,Split occurs always from next comma after colon 很容易编码
      • @rawr 你是对的。我保留解决方案,因为第二个解决方案与 OP 提到的完全相同