【问题标题】:Split a string vector with ' [ ] ' in R在R中用'[]'分割一个字符串向量
【发布时间】:2026-01-09 17:35:02
【问题描述】:

我有一个类似的字符串:

nw.str <- "[D][A|D][T|A:D][C|T]"

而我需要这样拆分:

"[D]" "[A|D]" "[T|A:D]" "[C|T]"

【问题讨论】:

  • 交叉发布到 R-help 和 SO 被认为是不好的形式。

标签: string r vector split


【解决方案1】:

您可以在base R 中执行此操作,只需使用strsplit 和零宽度断言(它们匹配字符但不使用它们)。基本上,我们寻找紧跟大括号后跟左大括号和紧跟大括号之前的左大括号并在它们之间拆分....

strsplit( x , "(?<=\\])(?=\\[)"  , perl = TRUE )
#[[1]]
#[1] "[D]"     "[A|D]"   "[T|A:D]" "[C|T]"

【讨论】:

    【解决方案2】:

    这里我使用stringr::str_replace_all 在值之间插入一个空格。然后在空格处拆分该字符串。

    > library(stringr)
    > s <- str_replace_all(nw.str, fixed("]["), fixed("] ["))
    > strsplit(s, " ")[[1]]  ## or unlist(strsplit(...))
    # [1] "[D]"     "[A|D]"   "[T|A:D]" "[C|T]" 
    

    另一种使用base R的方式(有很多),

    > g <- gsub("][", "] [", nw.str, fixed = TRUE)
    > unlist(strsplit(g, " "))
    

    【讨论】:

      【解决方案3】:

      gsubfn package 中使用strapplyc,我们指定了我们想要提取的内容(而不是我们想要拆分的内容)。

      在这种情况下,我们要提取左方括号"\\[",后跟任何".*?"(但最短的任何东西,而不是问号表示的最长),然后是右方括号"\\]"

      library(gsubfn)
      
      strapplyc(nw.str, "\\[.*?\\]")[[1]]
      

      给予:

      [1] "[D]"     "[A|D]"   "[T|A:D]" "[C|T]"  
      

      【讨论】:

      • gsubfn 看起来是一个非常有用的包。谢谢你介绍我。
      【解决方案4】:

      qdap 方法:

      library(qdap)
      bracketXtract(nw.str, with=TRUE)
      
      ##      all1      all2      all3      all4 
      ##     "[D]"   "[A|D]" "[T|A:D]"   "[C|T]"
      

      【讨论】:

        【解决方案5】:

        这是一种使用strsplit的方法:

        splitted <- strsplit(nw.str,"][", fixed=TRUE)[[1]]
        splitted[[1]] <- paste(splitted[[1]], "]", sep="")
        splitted[2:length(splitted)-1] <- paste("[", splitted[2:length(splitted)-1], "]", sep="")
        splitted[[length(splitted)]] <- paste("[", splitted[[length(splitted)]], sep="")
        splitted
        

        【讨论】:

          最近更新 更多