【问题标题】:Separate string into list in r将字符串分隔到r中的列表中
【发布时间】:2026-02-22 08:35:01
【问题描述】:

我在 R 中有一个如下所示的字符串:

"{[PP]}{[BGH]}{[AC]}{[ETL]}....{[D]}"

我想把它转换成一个列表,这样:

List[[1]] = {[PP]}
List[[2]] = {[BGH]}
....
List[[N]] = {[D]}

如果有逗号,你可以做 strsplit 但我想保留括号而不是去掉它们。不知道如何在 R

中执行此操作

【问题讨论】:

    标签: r string list parsing character


    【解决方案1】:

    qdap 中有一个方便的功能,即bracketXtract

    library(qdap)
    setNames(as.list(bracketXtract(s, "curly", TRUE)), NULL)
    #[[1]]
    #[1] "{[PP]}"
    
    #[[2]]
    #[1] "{[BGH]}"
    
    #[[3]]
    #[1] "{[AC]}"
    
    #[[4]]
    #[1] "{[ETL]}"
    
    #[[5]]
    #[1] "{[D]}"
    

    默认情况下,with = FALSE。所以不使用with = TRUE,会去掉括号。

    数据

    s <- "{[PP]}{[BGH]}{[AC]}{[ETL]}{[D]}" 
    

    【讨论】:

      【解决方案2】:

      必填stringi 回答:

      library(stringi)
      
      dat <- "{[PP]}{[BGH]}{[AC]}{[ETL]}{[more]{[D]}"
      as.list(stri_match_all_regex(dat, "(\\{\\[[[:alpha:]]+\\]\\})")[[1]][,2])
      ## [[1]]
      ## [1] "{[PP]}"
      ## 
      ## [[2]]
      ## [1] "{[BGH]}"
      ## 
      ## [[3]]
      ## [1] "{[AC]}"
      ## 
      ## [[4]]
      ## [1] "{[ETL]}"
      ## 
      ## [[5]]
      ## [1] "{[D]}"
      

      【讨论】:

        【解决方案3】:

        没有正则表达式:

        s <- "{[PP]}{[BGH]}{[AC]}{[ETL]}{[D]}"
        as.list(paste("{", strsplit(s, "\\{")[[1]][-1], sep = ""))
        [[1]]
        [1] "{[PP]}"
        
        [[2]]
        [1] "{[BGH]}"
        
        [[3]]
        [1] "{[AC]}"
        
        [[4]]
        [1] "{[ETL]}"
        
        [[5]]
        [1] "{[D]}"
        

        【讨论】:

        • 除了 \\{ ,这是一个正则表达式,如果你愿意,你可以使用 fixed=TRUEsep="{" 来避免。您还可以从将其反转为在} 上拆分(如paste0(strsplit(s,"}",fixed=TRUE)[[1]],"}"))中受益
        • 如果每个元素都以 {\ 开头并以 }]}]} 结尾,你会怎么做
        【解决方案4】:

        strsplit 如果你传递这个正则表达式 (?&lt;=})(?={) 仍然可以工作,它限制了拆分的位置:

        strsplit(s, "(?<=})(?={)", perl = T)
        
        # [[1]]
        # [1] "{[PP]}"  "{[BGH]}" "{[AC]}"  "{[ETL]}" "{[D]}" 
        

        或如@thelatemail 建议的那样:

        strsplit(s, "(?<=})", perl = T)
        

        【讨论】:

        • strsplit(x, "(?&lt;=})", perl=TRUE) 不够用有什么理由吗?
        • @thelatemail 不是。我认为这实际上是一个更好的答案。
        • 如果每个元素都以 {\ 开头并以 }]}]} 结尾,你会怎么做
        • 你能举个例子吗?根据您的描述,很难想象您拥有什么。
        • [1] "{\"suspect\": {\"duration\": 27.963592529296875, \"legOne\": {\"timestamp\": \"20110630235032921774\", \"side \": \"Offer\", \"price\": 131500.0, \"deltaCt\": 1, \"deltaSz\": 100, \"level\": 1, \"fixId\": 8327571}, \"legTwo\": {\"timestamp\": \"20110630235100885324\", \"side\": \"Offer\", \"price\": 131500.0, \"deltaCt\": -1, \" deltaSz\": -100, \"level\": 1, \"fixId\": 8327652}}, \"trade_hist\": [{\"price\": 131500.0, \"timestamp\":... ... \"订单\": 43}]}]}"
        最近更新 更多