2015-05-12 3 views
1

Iv'е был у него в течение некоторого времени, я пытаюсь извлечь несколько значений из шаблон строки в многострочном тексте, используя re.findall без везения.Поймать несколько вхождений строк в многострочном тексте

текст:

RX[0] 
qpn : 0x48 
cqn : 0x80 
rxBytes : 179531811 
rxPackets : 296242 
rxPacketsDropped : 0 
rxCheckSumOk : 225257 
rxCheckSumNone : 200 
RX[1] 
qpn : 0x49 
cqn : 0x81 
rxBytes : 0 
rxPackets : 0 
rxPacketsDropped : 0 
rxCheckSumOk : 0 
rxCheckSumNone : 0** 

мне нужно извлечь индекс ->RX[index] и rxPackets : value

если я разделить на разделы, чем я могу использовать -

re.findall('RX\[(\d+)\].*rxPackets\s*:\s*(\d+)', section, re.DOTALL) 

но я» m, чтобы сделать это с помощью одного шаблона регулярного выражения. Может ли кто-нибудь помочь мне пролить свет на то, как это сделать?

+0

Я подозреваю, что findall вернет список со всеми экземплярами. Вам нужно только индексировать список, чтобы найти (например.) RxPackets, который вы хотите – jcoppens

+0

, он возвращает список, содержащий 1 элемент, первый индекс и последнее значение rxPackets. – lddmonster

ответ

2

Это работает:

>>> txt='''\ 
... RX[0] 
... qpn : 0x48 
... cqn : 0x80 
... rxBytes : 179531811 
... rxPackets : 296242 
... rxPacketsDropped : 0 
... rxCheckSumOk : 225257 
... rxCheckSumNone : 200 
... RX[1] 
... qpn : 0x49 
... cqn : 0x81 
... rxBytes : 0 
... rxPackets : 0 
... rxPacketsDropped : 0 
... rxCheckSumOk : 0 
... rxCheckSumNone : 0** 
... ''' 
>>> import re 
>>> re.search(r'RX\[(\d+)\].*?rxPackets\s+:\s+(\d+)', txt, re.S).groups() 
('0', '296242') 

Или с FindAll:

>>> re.findall(r'RX\[(\d+)\].*?rxPackets\s+:\s+(\d+)', txt, re.S) 
[('0', '296242'), ('1', '0')] 

Сравните с помощью жадного формы .*:

>>> re.findall(r'RX\[(\d+)\].*rxPackets\s+:\s+(\d+)', txt, re.S) 
[('0', '0')] 

Что вы можете увидеть визуально здесь для greedy и not greedy

+0

im пытается получить список, содержащий кортежи всех блоков [('0', 296242 '), (' 1 ',' 0 ') .. ..] – lddmonster

+0

Не нашел ли в примере, который я опубликовал, так? – dawg

+0

THANKSS !!! наконец .. это выгнало меня из меня ... – lddmonster

0

Я слишком глуп, чтобы использовать регулярное выражение, чтобы решить эту проблему.

rxDict = dict() 
key = '' 
for line in lines: 
    if 'RX' in line: 
    key = line.split('[')[-1].split(']')[0] 
    if key != '': 
     if 'rxPackets' in line: 
      rxDict[key] = line.split(':').strip() 
      key = '' 
+0

спасибо, но ive все готово получило решение без регулярного выражения. – lddmonster