【问题标题】:Extract all matching pattern from a character vector [duplicate]从字符向量中提取所有匹配模式[重复]
【发布时间】:2020-02-05 10:43:51
【问题描述】:

我有这个向量:

 [1] "capacit_elab_doc_Ne sait pas du tout le faire"     "capacit_elab_doc_Pas tres a l aise"               
 [3] "capacit_elab_doc_Moyennement a l aise"             "capacit_elab_doc_Plutot a l aise"                 
 [5] "capacit_elab_doc_Tres a l aise"                    "capacit_rech_info_Ne sait pas du tout le faire"   
 [7] "capacit_rech_info_Pas tres a l aise"               "capacit_rech_info_Moyennement a l aise"           

我想匹配这些值:

[1] "capacit_elab_doc"     "capacit_rech_info"    "capacit_eval_info"    "capacit_id_numerique"

要得到这个输出:

[1] "capacit_elab_doc"  "capacit_elab_doc"  "capacit_elab_doc" 
[4] "capacit_elab_doc"  "capacit_elab_doc"  "capacit_rech_info"
[7] "capacit_rech_info" "capacit_rech_info"

我该怎么做?我更喜欢 stringr 解决方案。

【问题讨论】:

标签: r regex string stringr


【解决方案1】:

也许您可以使用regmatches 尝试以下基本 R 解决方案

unlist(regmatches(v,gregexpr(paste0(pat,collapse = "|"),v)))

# [1] "capacit_elab_doc"  "capacit_elab_doc"  "capacit_elab_doc"  "capacit_elab_doc"  "capacit_elab_doc" 
# [6] "capacit_rech_info" "capacit_rech_info" "capacit_rech_info"

其中v 是字符串向量,pat 表示所有模式。

数据

v <- c("capacit_elab_doc_Ne sait pas du tout le faire", "capacit_elab_doc_Pas tres a l aise", 
"capacit_elab_doc_Moyennement a l aise", "capacit_elab_doc_Plutot a l aise", 
"capacit_elab_doc_Tres a l aise", "capacit_rech_info_Ne sait pas du tout le faire", 
"capacit_rech_info_Pas tres a l aise", "capacit_rech_info_Moyennement a l aise"

pat <- c("capacit_elab_doc", "capacit_rech_info", "capacit_eval_info", 
"capacit_id_numerique")

【讨论】:

    【解决方案2】:

    为什么不简单:

    stringr::str_match(string = your_vector,
                       pattern = "^capacit_elab_doc*|^capacit_rech_info*|^capacit_eval_info*|^capacit_id_numerique*") %>% as.vector
    

    【讨论】:

      【解决方案3】:

      这种方式使用带有负前瞻(?=_) 的正则表达式来匹配所有内容,直到第三个下划线为止。

      library(stringr)
      
      text <- list("capacit_elab_doc_Ne sait pas du tout le faire", "capacit_elab_doc_Pas tres a l aise", "capacit_elab_doc_Moyennement a l aise", "capacit_elab_doc_Plutot a l aise", "capacit_elab_doc_Tres a l aise", "capacit_rech_info_Ne sait pas du tout le faire", "capacit_rech_info_Pas tres a l aise", "capacit_rech_info_Moyennement a l aise") 
      
      lapply(text, function(x) str_extract(x, "(.*_.*_.*)(?=_)"))
      #> [[1]]
      #> [1] "capacit_elab_doc"
      #> 
      #> [[2]]
      #> [1] "capacit_elab_doc"
      #> 
      #> [[3]]
      #> [1] "capacit_elab_doc"
      #> 
      #> [[4]]
      #> [1] "capacit_elab_doc"
      #> 
      #> [[5]]
      #> [1] "capacit_elab_doc"
      #> 
      #> [[6]]
      #> [1] "capacit_rech_info"
      #> 
      #> [[7]]
      #> [1] "capacit_rech_info"
      #> 
      #> [[8]]
      #> [1] "capacit_rech_info"
      

      reprex package (v0.3.0) 于 2020 年 2 月 5 日创建

      【讨论】:

        【解决方案4】:

        如果你坚持stringr,一种方法是:

        stringr::str_match(your_vector, '(.*)_.*')[,2]
        

        否则只有sub('(.*)_.*', '\\1', your_vector) 会这样做。

        【讨论】:

          猜你喜欢
          • 2022-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多