Regex - сопоставить слово / буквы под заданным шаблоном c - PullRequest
0 голосов
/ 20 февраля 2020

Очень необычный, но я пытаюсь сопоставить вывод из сеанса S SH, который может свернуть представление и попасть под требуемый вывод (например, свернутый столбец) ...

Посмотрите на Пример вывода:

      System Id     Interface          Circuit Id        State HoldTime Type     PRI
--------------------------------------------------------------------------------
rtr1.lab01.some GE0/0/1            0000000001         Up   22s      L2       -- 
thing                                                                              
rtr2.lab01.some GE0/0/2            0000000002         Up   24s      L2       -- 
thingelse                                                                              

Я могу сопоставить первую строку с:

^ ([a-zA-Z0-9] [a-zA-Z0-9 .-] + [a-zA-Z0-9])

, который возвращает (rtr1.lab01.some и rtr2.lab01.some), но я пытаюсь найти самый простой способ сопоставить оно основано на полном имени хоста (rtr1.lab01.something и rtr2.lab01.somethingelse)

Я также отлично сопоставляю остальные выходные данные и могу извлечь данные, но на самом деле не могу найти способ достичь того, что я пытаюсь ... Может кто-то направить меня в правильном направлении? Для дальнейшего расширения (для большего контекста ... Я использую Google TextFSM в Python, чтобы сопоставить все эти данные из сеанса S SH)

1 Ответ

0 голосов
/ 20 февраля 2020
import re

text = """System Id     Interface          Circuit Id        State HoldTime Type     PRI
--------------------------------------------------------------------------------
rtr1.lab01.some GE0/0/1            0000000001         Up   22s      L2       --
thing
rtr2.lab01.some GE0/0/2            0000000002         Up   24s      L2       --
thingelse
rtr2.lab01.abcd GE0/0/4            0000000003         Up   24s      L2       --
rtr2.lab01.none GE0/0/24           0000000004         Up   24s      L2       --
sense
rtr2.lab01.efgh GE0/0/5            0000000003         Up   24s      L2       --
"""

lines = text.rstrip().split('\n')[2:]
n_lines = len(lines)
current_line = -1

def get_next_line():
    # Actual implementation would be reading from a file and yielding lines one line at a time
    global n_lines, current_line, lines
    current_line += 1
    # return special sentinel if "end of file"
    return  lines[current_line] if current_line < n_lines else '$'


def get_system_id():
    line = None
    while line != '$': # loop until end of file
        if line is None: # no current line
            line = get_next_line()
            if line == '$': # end of file
                return
        m = re.search(r'^([a-zA-Z0-9][a-zA-Z0-9.-]+[a-zA-Z0-9])', line)
        id = m[1]
        line = get_next_line() # might be sentinel
        if line != '$' and re.match(r'^[a-zA-Z0-9]+$', line): # next line just single id?
            id += line
            line = None # will need new line
        yield id

for id in get_system_id():
    print(id)

Отпечатки:

rtr1.lab01.something
rtr2.lab01.somethingelse
rtr2.lab01.abcd
rtr2.lab01.nonesense
rtr2.lab01.efgh

См. Python Демо

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