R 从字符向量中提取所有匹配模式

R 从字符向量中提取所有匹配模式,r,regex,string,stringr,R,Regex,String,Stringr,我有这个向量: [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_T

我有这个向量:

 [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解决方案。

也许您可以使用
regmatches

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")
v为什么不干脆:

stringr::str\u match(string=your\u向量,
pattern=“^capacity\u elab\u doc*.^capacity\u rech\u info*.^capacity\u eval\u info*.^capacity\u id\u numerique*”)%>%as.vector

这种方法使用具有负前瞻性的正则表达式(?=)
匹配所有内容,直到第三个下划线

库(stringr)
案文[[1]]
#>[1]“能力文件”
#> 
#> [[2]]
#>[1]“能力文件”
#> 
#> [[3]]
#>[1]“能力文件”
#> 
#> [[4]]
#>[1]“能力文件”
#> 
#> [[5]]
#>[1]“能力文件”
#> 
#> [[6]]
#>[1]“电容记录信息”
#> 
#> [[7]]
#>[1]“电容记录信息”
#> 
#> [[8]]
#>[1]“电容记录信息”

由(v0.3.0)于2020年2月5日创建如果您坚持使用stringr,一种方法是:

stringr::str_match(your_vector, '(.*)_.*')[,2]
否则,只需
sub('(.*..*','\\1',您的向量)
就可以了