【问题标题】:Extract multiple instances of a pattern from a string in R从R中的字符串中提取模式的多个实例
【发布时间】:2015-05-12 05:12:20
【问题描述】:

我有一个字符向量t,如下。

t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
    "GID895 GID895 K350")

我想提取所有以 GID 开头并后跟数字序列的字符串。

这可行,但不会检索多个实例。

gsub(".*(GID\\d+).*", "\\1", t)
[1] "GID456"  "GID667"  "GID2345" "GID895" 

在这种情况下如何提取所有字符串?想要的输出如下

out <- c("GID456", "GID456", "GID667", "GID45345", "GID2345", 
        "GID895", "GID895")

【问题讨论】:

    标签: regex r


    【解决方案1】:

    这是一种使用我维护 qdapRegex(我更喜欢这个或 stringi/stringr)的包的方法,以保持一致性和易用性。我还展示了一种基本方法。无论如何,我更倾向于将其视为“提取”问题而不是字幕问题。

    y <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
        "GID895 GID895 K350")
    
    library(qdapRegex)
    unlist(ex_default(y, pattern = "GID\\d+"))
    
    ## [1] "GID456"   "GID456"   "GID667"   "GID45345" "GID2345"  "GID895"   "GID895" 
    

    在基础 R 中:

    unlist(regmatches(y, gregexpr("GID\\d+", y)))
    

    【讨论】:

      【解决方案2】:

      我参加聚会迟到了,但这个 tidyverse 单行字可能对某人有用。

      用 stringr + dplyr:

      t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", "GID895 GID895 K350")
      str_extract_all(t, regex("GID\\d+")) %>% unlist()
      

      给予:

      [1] "GID456" "GID456" "GID667" "GID45345" "GID2345" "GID895" "GID895"  
      

      【讨论】:

        【解决方案3】:

        通过gsub

        > t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
        +        "GID895 GID895 K350")
        > unlist(strsplit(gsub("(GID\\d+)|.", "\\1 ", t), "\\s+"))
        [1] "GID456"   "GID456"   "GID667"   "GID45345" "GID2345" 
        [6] "GID895"   "GID895"
        

        【讨论】:

          【解决方案4】:

          我使用了stringr 包中的str_split 函数

          library(stringr)
          word.list = str_split(t, '\\s+') 
          new_list <- unlist(word.list)
          new_list[grep("GID", new_list)]
          

          我希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-06-10
            • 1970-01-01
            • 2018-10-11
            • 1970-01-01
            • 2019-09-28
            • 1970-01-01
            • 1970-01-01
            • 2012-07-16
            相关资源
            最近更新 更多