从正则表达式

时间:2015-08-05 21:53:29

标签: regex r

This regex(.*?)(?:I[0-9]-)*I3(?:-I[0-9])*匹配使用多个组的表达式。正则表达式的关键在于它以两对的形式捕获模式,其中正则表达式的第一部分必须遵循正则表达式的第二部分。

如何提取这两组中的每一组?

library(stringr)
data <- c("A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3-I7")
str_extract_all(data, "(.*?)(?:I[0-9]-)*I3(?:-I[0-9])*")

给我:

[[1]]
[1] "A-B-C-I1-I2-D-E-F-I1-I3"          "-D-D-D-D-I1-I1-I2-I1-I1-I3-I3-I7"

但是,我想要的是:

[[1]]
[1] "A-B-C-I1-I2-D-E-F" [2] "I1-I3"
[[2]]
[1] "D-D-D-D" [2] "I1-I1-I2-I1-I1-I3-I3-I7"

这里的关键是正则表达式匹配两次,每次包含2组。我希望每场比赛都有自己的列表,并且该列表包含2个元素,每个组一个。

1 个答案:

答案 0 :(得分:1)

您需要围绕表达式的第二部分包装一个捕获组,如果您使用 stringr 执行此任务,我会使用str_match_all代替返回捕获的匹配......

library(stringr)

data <- c('A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3-I7')
mat <- str_match_all(data, '-?(.*?)-((?:I[0-9]-)*I3(?:-I[0-9])*)')[[1]][,2:3]
colnames(mat) <- c('Group 1', 'Group 2')

#      Group 1             Group 2                  
# [1,] "A-B-C-I1-I2-D-E-F" "I1-I3"                  
# [2,] "D-D-D-D"           "I1-I1-I2-I1-I1-I3-I3-I7"