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

bob*_*bel 4 regex r regex-group

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

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

我想提取所有"FACT"和FACT之后的第一个数字.所以这个例子的结果将是:

c("FACT1", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2", "FACT1 FACT2 FACT3")
Run Code Online (Sandbox Code Playgroud)

或者,结果可以是列表,其中列表的每个元素是具有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 "
Run Code Online (Sandbox Code Playgroud)

它看起来不错,除了第一个元素的"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" 
Run Code Online (Sandbox Code Playgroud)

那么如何才能正确提取群组呢?

Wik*_*żew 5

您也可以使用基本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"
Run Code Online (Sandbox Code Playgroud)

使用您的FACT[1-3](或FACT[0-9],或FACT\\d)模式提取所有匹配项,然后使用空格"加入"它们.