代码之家  ›  专栏  ›  技术社区  ›  bobbel

如何在R中提取这些多个正则表达式组

  •  4
  • bobbel  · 技术社区  · 7 年前

    我有以下格式的字符串输入:

    my.strings <- c("FACT11", "FACT11:FACT20", "FACT1sometext:FACT20", "FACT1text with spaces:FACT20", "FACT14:FACT20", "FACT1textAnd1312:FACT2etc", "FACT12:FACT22:FACT31")
    

    c("FACT1", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2 FACT3")
    

    或者,结果可以是一个列表,其中列表的每个元素都是一个包含1到3个项的向量。

    到目前为止我得到的是:

    gsub("(FACT[1-3]).*?:(FACT[1-3]).*", '\\1 \\2', my.strings)
    # [1] "FACT11"       "FACT1 FACT2 " "FACT1 FACT2 " "FACT1 FACT2 " "FACT1 FACT2 " "FACT1 FACT2 "
    # [7] "FACT1 FACT2 " "FACT1 FACT2 "
    

    它看起来有点不错,除了第一个元素的“FACT11”而不是“FACT1”(去掉第二个“1”),还有最后一个元素的“FACT3” my.strings . 但加入另一组 gsub 不知怎么搞砸了整件事。

    gsub("(FACT[1-3]).*?:(FACT[1-3]).*?:(FACT[1-3]).*?", '\\1 \\2 \\3', my.strings)
    # [1] "FACT11"                       "FACT11:FACT20"                "FACT1sometext:FACT20"        
    # [4] "FACT1text with spaces:FACT20" "FACT14:FACT20"                "FACT1textAnd1312:FACT2etc"   
    # [7] "FACT12:FACT21"                "FACT1 FACT2 FACT31" 
    

    那么,我如何才能正确提取组?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Wiktor Stribiżew    7 年前

    您也可以使用base R方法:

    > m <- regmatches(my.strings, gregexpr("FACT[1-3]", my.strings))
    > sapply(m, paste, collapse=" ")
    [1] "FACT1"            
    [2] "FACT1 FACT2"      
    [3] "FACT1 FACT2"      
    [4] "FACT1 FACT2"      
    [5] "FACT1 FACT2"      
    [6] "FACT1 FACT2"      
    [7] "FACT1 FACT2 FACT3"
    

    FACT[1-3] (或 FACT[0-9] ,或 FACT\\d )模式,然后用空格“连接”它们。

        2
  •  4
  •   akrun    7 年前

    str_extract_all stringr 提取所有“事实”子字符串,后跟1到3的数字( [1-3] list 属于 vector map 通过 列表 元素和 paste 这个 矢量 s到单个字符串

    library(tidyverse)
    str_extract_all(my.strings, "FACT[1-3]") %>%
                map_chr(paste, collapse= ' ')
    #[1] "FACT1"             "FACT1 FACT2"       "FACT1 FACT2"      
    #[4] "FACT1 FACT2"       "FACT1 FACT2"       "FACT1 FACT2"      
    #[7] "FACT1 FACT2 FACT3"
    

    gsub base R

    gsub("\\s{2,}", " ", trimws(gsub("(FACT[1-3])(*SKIP)(*FAIL)|.",
                           " ", my.strings, perl = TRUE)))
    #[1] "FACT1"             "FACT1 FACT2"       "FACT1 FACT2"      
    #[4] "FACT1 FACT2"       "FACT1 FACT2"       "FACT1 FACT2"      
    #[7] "FACT1 FACT2 FACT3"
    
        3
  •  0
  •   s_baldur    7 年前

    这个解决方案使用了 FACT

    my.strings %>%  
      gsub("(\\d)\\d*", "\\1:", ., perl = TRUE) %>% 
      strsplit(":") %>%
      sapply(function(x) paste(x[grepl("FACT", x)], collapse = " "))
    
    [1] "FACT1"             "FACT1 FACT2"       "FACT1 FACT2"       "FACT1 FACT2"      
    [5] "FACT1 FACT2"       "FACT1 FACT2"       "FACT1 FACT2 FACT3"