2015-08-05 4 views
1

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

вау .... полностью неверно прояснил вопрос .... – Nefariis

+1

'(?: ...)' - не захватывающая группа ... – hwnd

+0

У вас нет двух групп захвата. – hwnd

ответ

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" 
Смежные вопросы