2014-10-20 2 views
0

У меня есть регулярное выражение, которое выглядит как:Extract имя и Пролет Regex Сопрягано группы

rgx = '(?P<foo>ABC)(?P<bar>DEF)?(?P<norf>HIJK)' 

Получение совпавшей строки не проблема m.group(name). Тем не менее, мне нужно извлечь имя и span из сопоставленных групп (или даже просто по имени) и не нашли способ сделать это. Я хотел бы сделать что-то вроде:

p = re.compile(p, re.IGNORECASE) 
m = p.match(targetstring) 
#then do something to set 'all' to the list of match objects 
for mo in all 
    print mo.name() + '->' + mo.span() 

Так, например, строка ввода «ABCDEFHIJK» должен генерировать вывод:

'foo' -> (0, 3) 
'bar' -> (3, 6) 
'norf' -> (6, 10) 

Спасибо!

+0

что 'span'? – laike9m

+0

отправьте пример вместе с ожидаемым выходом. –

+0

@ laike9m span - это метод, относящийся к средству Matchge для регулярного выражения. Он сообщает, какая часть строки была сопоставлена. – Colin

ответ

3

Вы перебирать имена соответствующих групп (ключей groupdict) и распечатать соответствующий span атрибут:

rgx = '(?P<foo>ABC)(?P<bar>DEF)?(?P<norf>HIJK)' 
p = re.compile(rgx, re.IGNORECASE) 
m = re.match(p, 'ABCDEFHIJKLM') 

for key in m.groupdict(): 
    print key, m.span(key) 

Печатается:

foo (0, 3) 
bar (3, 6) 
norf (6, 10) 

Редактировать: С помощью клавиш словаря неупорядочены, вы можете явно выбрать порядок, в котором итерации повторяются. В приведенном ниже примере, sorted(...) список имен групп отсортирован по соответствующему словаре значение (span кортеж):

for key in sorted(m.groupdict().keys(), key=m.groupdict().get): 
    print key, m.span(key) 
+0

Ваш код не печатает ваш результат. – georg

+0

@georg К сожалению. Исправлена ​​опечатка. Благодаря! –

+0

Это лучше, но все равно сигары. 'groupdict' - это словарь, поэтому порядок результатов не гарантируется. – georg

2

Вы можете использовать RegexObject.groupindex:

p = re.compile(rgx, re.IGNORECASE) 
m = p.match('ABCDEFHIJK') 

for name, n in sorted(m.re.groupindex.items(), key=lambda x: x[1]): 
    print name, m.group(n), m.span(n)