2014-01-25 5 views
2

Рассмотрим следующий код.Позиция подзаголовков

import re 

text = "def oneFunc(x, y): return 0" 

pattern = re.compile(
    r"(?P<DEF_FUNC>def (?P<NAME_FUNC>\w+)\s*\((.*?)\):)|(?P<OTHERS>\w+)" 
) 

print('---', text, sep = "\n") 

for m in pattern.finditer(text): 
    mdict = m.groupdict() 

    print('---', (m.start(), m.end()), sep = "\n") 

    for name, textfound in mdict.items(): 
     if textfound != None: 
      print((name, textfound)) 

Это дает следующий выход.

--- 
def oneFunc(x, y): return 0 
--- 
(0, 18) 
('NAME_FUNC', 'oneFunc') 
('DEF_FUNC', 'def oneFunc(x, y):') 
--- 
(19, 25) 
('OTHERS', 'return') 
--- 
(26, 27) 
('OTHERS', '0') 

Можно спросить непосредственно re позиции submatchings? Например, я хотел бы знать, что 'oneFunc' начинается с 4 и заканчивается на 11, но у меня есть только позиции самого большого совпадения тока.

ответ

0

В дополнение к первому ответу, что, безусловно, правильно, вы можете также найти .regs и .groups() полезно что-то вроде этого:

for m in pattern.finditer(text): 
    group_indices = dict(zip(m.groups(), m.regs[1:])) # the first element of m.regs is the overall match 

Выход является dict, который имеет совпадающую строку/подстроку в качестве ключа и индексы в качестве значения. Например, следующие три dict s будет результатом ваших поисков выше:

{'def oneFunc(x, y):': (0, 18), 'x, y': (12, 16), None: (-1, -1), 'oneFunc': (4, 11)} 
{'return': (19, 25), None: (-1, -1)} 
{None: (-1, -1), '0': (26, 27)} 

Вы можете, конечно, также поменять местами ключи/значения в этих словарях, используя dict(zip(m.regs[1:], m.groups())) вместо dict(zip(m.groups(), m.regs[1:])).

Смежные вопросы