LINUX.ORG.RU

[python] регекспы


0

0

пытаюсь распарсить такую строку:

data='GigabitEthernet0/4 is down, line protocol is down (notconnect)\n0 packets input, 0 bytes, 0 no buffer\nGigabitEthernet0/5 is down, line protocol is down (notconnect)\n0 packets input, 0 bytes, 0 no buffer\n'

слудующий код:

p = re.compile('GigabitEthernet\d+/\d+.*no buffer', re.S)
re.findall(p, data)

возвращает всю строку:

['GigabitEthernet0/4 is down, line protocol is down (notconnect)\n0 packets input, 0 bytes, 0 no buffer\nGigabitEthernet0/5 is down, line protocol is down (notconnect)\n0 packets input, 0 bytes, 0 no buffer']

Как правильно написать регулярку, которая разобьёт строку на части так:

['GigabitEthernet0/4 is down, line protocol is down (notconnect)\n0 packets input, 0 bytes, 0 no buffer\n', 'GigabitEthernet0/5 is down, line protocol is down (notconnect)\n0 packets input, 0 bytes, 0 no buffer']

?

★★

Делай split по «\nGigabitEthernet» и не используй regexp.

SOmni ★★ ()

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

Jetty ★★★★★ ()
Ответ на: комментарий от Jetty

> лучше взять немношко перла и спросить все то же самое через SNMP

С SNMP согласен, но зачем брать немножко перла в проект на питоне, если это не одиночный мелкий скрипт?

const86 ★★★★★ ()
Ответ на: комментарий от const86

Автор не упоминает о том что это проект на питоне :)
Скорее всего он хочет снимать статистику/состояние с цыцки/чего-то подобного

Jetty ★★★★★ ()

Логично предположить чтение построчно. Делаешь что-то типа автомата состояний

S = 0; L = []

for line in F:
    if S <= 0:
        L.append(line)

        if line[:15] == 'GigabitEthernet':
            S = 1
    else:
        L[-1] += line
        S -= 1

Код можно легко расширить на различные слова-триггеры с любым кол-вом группируемых строк.

mikki ()
Ответ на: комментарий от mikki

В pythonовских строчках есть классная штука: startswith():

if line.startswith('GigabitEthernet'):
    S = 1

Это быстрее понятнее и не надо символы считать :)

rymis ★★ ()
Ответ на: комментарий от ksv

Чтение построчно не тру :)

r = re.compile(r'(FastEthernet\d+/\d+).*?(\d+) input errors, (\d+) CRC.*?(\d+) output errors', re.S ) 

Нежадный поиск помог, спасибо :) По SNMP не получается доставать детализацию ошибок на интерфейсе, то есть общее количество - пожайлуста, а подробно - нет.

spiro ★★ ()
Ответ на: комментарий от Jetty

> А если бы немножко подумать головой, то лучше взять немношко перла и спросить все то же самое через SNMP...

А шо, ты думаешь на питоне никто еще не замутил SNMP?

anonymous ()
Ответ на: комментарий от anonymous

Патологическая фанатичная любовь к перлу отметает даже самые очевидные аргументы. Например, такие, как слово simple в названии протокола.

balodja ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.