Извлечение цифр с использованием регулярного выражения с несколькими условиями в абзацах в python - PullRequest
1 голос
/ 14 июля 2020

У меня есть этот текст в файлах .txt:

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
24 455  36  63  700 800 900 456 87 35 46
2 root 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 thread

crt - 00:00:04 up 200 days, 23:39, 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

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

regex.findall(r'(?<!\d)(?<=\bcrt\b.*?)(?:\d{2}:\d{2}(?::\d{2})?|\d*\.?\d+)(?!\d)(?=.*\bcached\b)', text, regex.S)

Но это дает все цифры, в том числе между PID и thread. Есть идеи?

1 Ответ

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

Поскольку вы уже используете модуль regex (который поддерживает переменную lookbehind), вы можете легко использовать \G и \K:

(?:^crt|\G(?!\A))(?:(?!^$)\D)*\K[.:\d]+

См. демонстрация на regex101.com .


В разбивке, это предполагает несколько вещей:
(?:
    ^crt        # start a line with crt
    |           # or 
    \G(?!\A)    # start after thre previous match (unless it is the very start of the string)
)
(?:(?!^$)\D)*\K # match any non-digit character, but stop at empty lines
[.:\d]+         # character class with ., : and digits

В Python код может быть:

import regex as re

junk = """
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
24 455  36  63  700 800 900 456 87 35 46
2 root 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 thread

crt - 00:00:04 up 200 days, 23:39, 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
"""

rx = re.compile(r'(?:^crt|\G(?!\A))(?:(?!^$)\D)*\K[.:\d]+', re.M)

for match in rx.finditer(junk):
    print(match.group(0))

Что дает (сокращенно):

00:00:00
200
23:35
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...