Извлечение чисел до определенного абзаца с использованием многократного выражения Regex в python - PullRequest
1 голос
/ 13 июля 2020

Я новичок в регулярных выражениях. Я пытаюсь извлечь данные из файлов журнала, и в каждом файле есть такой текст:

crt - 00:00:00 up 200 days, 23:35, 0 users, load average: 0.04, 0.05, 0.02
Tasks: 300 total, 2 running, 298 sleeping, 0 stopped, 0 zombie
Cpu(s): 12.0%us, 2.5%sy, 0.0%ni, 89.2%id, 0.0%hi, 0.1%si, 0.0%st
Mem: 123456K total, 1234567k used, 989991k free, 11156793k buffers
Swap: 456K total, 30897564k used, 785431k free, 23445897k cached

PID User Pr NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

Я извлекаю только значения di git до слова cached. Для этого я создаю разные шаблоны для каждого di git, а затем извлекаю значения в список, используя finditer. Мой код до сих пор:

[x.group()for x in re.finditer(r"(\d{2}:\d{2}:\d{2})|(\d+\.\d+?)%id"), text]

Это фрагмент регулярного выражения, в котором я должен указать шаблон для каждой строки суффикса и префикса di git. Есть ли более эффективный способ вывода результатов?

desired_values=[00:00:00, 200, 23:35, 0, 0.04, 0.05, 0.02 , 
               300, 2, 298, 0, 0, 
               12.0, 2.5, 0.0, 89.2, 0.0, 0.1, 0.0, 
               123456, 1234567, 989991, 11156793, 
               9234456, 30897564, 785431, 23445897]

These values then i insert in database, that's why they should be in list.

1 Ответ

1 голос
/ 13 июля 2020

Вы можете использовать

r'(?s)(?<!\d)(?:\d{2}:\d{2}(?::\d{2})?|\d*\.?\d+)(?!\d)(?=.*\bcached\b)'

См. демонстрацию регулярных выражений

Подробности

  • (?<!\d) - no di git слева разрешено
  • (?:\d{2}:\d{2}(?::\d{2})?|\d*\.?\d+) - любое из
    • \d{2}:\d{2}(?::\d{2})? - 2 цифры, :, 2 цифры и затем необязательная последовательность : и 2 цифры
    • | - или
    • \d*\.?\d+ - 0+ цифр, необязательно ., а затем 1+ цифр
  • (?!\d) - no di git сразу вправо разрешено
  • (?=.*\bcached\b) - где-то справа от текущего местоположения должно быть слово cached.

Python демо :

import re
text = r"""crt - 00:00:00 up 200 days, 23:35, 0 users, load average: 0.04, 0.05, 0.02
Tasks: 300 total, 2 running, 298 sleeping, 0 stopped, 0 zombie
Cpu(s): 12.0%us, 2.5%sy, 0.0%ni, 89.2%id, 0.0%hi, 0.1%si, 0.0%st
Mem: 123456K total, 1234567k used, 989991k free, 11156793k buffers
Swap: 456K total, 30897564k used, 785431k free, 23445897k cached
 
PID User Pr NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND"""
print( re.findall(r'(?<!\d)(?:\d{2}:\d{2}(?::\d{2})?|\d*\.?\d+)(?!\d)(?=.*\bcached\b)', text, re.S) )

Вывод:

['00:00:00', '200', '23:35', '0', '0.04', '0.05', '0.02', '300', '2', '298', '0', '0', '12.0', '2.5', '0.0', '89.2', '0.0', '0.1', '0.0', '123456', '1234567', '989991', '11156793', '456', '30897564', '785431', '23445897']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...