Регулярное выражение в python для извлечения строки, начинающейся с одной строки, посередине другой строки и заканчивающейся другой строкой - PullRequest
1 голос
/ 02 апреля 2020

это мой код:

 s="""
    [  8]   0.00-34.53  sec  0.00 Bytes  0.00 bits/sec                  receiver    
    [SUM]   0.00-34.53  sec  2.11 GBytes   624 Mbits/sec                  sender    
    [ 12]   0.00-34.53  sec  0.00 Bytes  0.00 bits/sec                  receive
    [SUM]   0.00-34.75  sec  0.00 Bytes  0.00 bits/sec                  sender
    [SUM]   0.00-34.53  sec  2.11 GBytes   824 Mbits/sec                  sender
    [SUM]   0.00-34.75  sec  0.00 Bytes  0.00 bits/sec                  sender
    """
   items=re.findall("^.[SUM].*sender",s,re.MULTILINE)
     for x in items:
     print(x)

, который дает вывод:

[SUM]   0.00-34.53  sec  2.11 GBytes   624 Mbits/sec                  sender
[SUM]   0.00-34.53  sec  2.11 GBytes   824 Mbits/sec                  sender
[SUM]   0.00-34.75  sec  0.00 Bytes  0.00 bits/sec                  sender
[SUM]   0.00-34.75  sec  0.00 Bytes  0.00 bits/sec                  sender

, но я хочу получить приведенный ниже вывод, который начинается со строки [SUM] и заканчивается строкой отправителя и не должна отображать строку, которая имеет 0,00 байт и 0,00 бит / сек c

[SUM]   0.00-34.53  sec  2.11 GBytes   624 Mbits/sec                  sender
[SUM]   0.00-34.53  sec  2.11 GBytes   824 Mbits/sec                  sender

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

При отрицательном прогнозе вы можете использовать это регулярное выражение:

reg = "^\s*\[SUM\]\s*[0-9\-\.]+\s+sec(?!\s+0\.00 Bytes).*sender.*"
items=re.findall(reg,s,re.MULTILINE)
for line in items:
    print(line)

The?! указывает, что регулярное выражение после не должно совпадать. Подробнее

0 голосов
/ 02 апреля 2020

Это должно сработать для вас - вы можете внести некоторые изменения для ваших конкретных c потребностей:

In [151]: regex = "^(\[SUM\](?!.*(([0-9]+\.[0-9]{2}).*){3}.*0\.00).*sender)"

In [152]: items=re.findall(regex,s,re.MULTILINE)
     ...: for x in items:
     ...:     print(x)
     ...:     
('[SUM]   0.00-34.53  sec  2.11 GBytes   624 Mbits/sec                  sender', '', '')
('[SUM]   0.00-34.53  sec  2.11 GBytes   824 Mbits/sec                  sender', '   0.00', '   0.00-34.53  sec  2.11')
...