Поймать несколько строковых вхождений в многострочном тексте

Я занимаюсь этим уже некоторое время, я пытаюсь извлечь несколько значений из строкового шаблона в многострочном тексте, используя 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)

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

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')]

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

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

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 = ''
Другие вопросы по тегам