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个元素,每个组一个。
答案 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"