Задать вопрос
@Tiasar
Web Developer

Как перемотать в pyparser SkipTo до нужного места?

Помогите понять этот pyparser, есть такой тестовый код:
from pprint import pprint
from pyparsing import ParseException, CaselessLiteral, White, Suppress, Combine, CaselessKeyword, Word, Optional, nums, alphas, SkipTo, ZeroOrMore, OneOrMore, printables, Group, LineStart, LineEnd, QuotedString, delimitedList, pyparsing_unicode

source_string = '''

... много чего выше ...

Номер нарушения: 82364311 (ACTIVE)
****************** Источник инцидента: ******************
Тип инцидента: Source IP - 10.12.2.138
Description: Одновременное подключения нескольких пользователей Рекомендации по устранению: 1.Проанализировать IP источников 
****************** Общая информация ******************
Description: OTR.WIN.CASE04: Windows Multiple Network Logins
Категория инцидента: N/A
Дата и время обнаружения нарушения ИБ: 2019-11-09 11:33:29
Дата и время окончания нарушения ИБ: 2019-11-09 11:33:29
Credibility:3 Relevance:6 Severity:1
Тип правила: EVENT
Всего событий и потоков: 9
****************** Информация об активе ******************
Основные свойства
Given Name: OTRBSB01
Unified Name: OTRBSB01
Description: Сервер БД 
"DataBase DB PROD" 
БД системы: 
[CL_OTRB_7307] – основная БД ICM, содержит все данные и параметры приложения ICM 
[CL_OTRB_SYS] – содержит данные и па
Network: N/A
Business Owner: N/A
Business Contact: N/A
Technical Owner: N/A
Technical Contact: N/A
Technical User: N/A

... много чего ниже ...

'''

try:
    _printables = printables + pyparsing_unicode.Cyrillic.alphas + '–'

    _onsource_id = CaselessKeyword('Номер нарушения:') + Word(_printables) + Suppress(Optional(Word(_printables)))
    _name = CaselessKeyword('Description:') + Word(_printables + ' ')
    _onsource_ts = CaselessKeyword('Дата и время обнаружения нарушения ИБ:') + Word(_printables + ' ')

    _common_information = OneOrMore(_onsource_id) \
        + Suppress(ZeroOrMore(Word(_printables + ' ') + SkipTo(Word('*')+CaselessKeyword('Общая информация')+Word('*')))) \
        | OneOrMore(_name) \
        | OneOrMore(_onsource_ts)

    pprint(_common_information.searchString(source_string).asList())

except ParseException as err:
    print(err.line)
    print(" " * (err.column - 1) + "^")
    print(err)

При исполнении получаю результат:
[['Номер нарушения:', '82364311'],
 ['Description:', 'OTR.WIN.CASE04: Windows Multiple Network Logins'],
 ['Дата и время обнаружения нарушения ИБ:', '2019-11-09 11:33:29'],
 ['Description:', 'Сервер БД ']]


По тексту встречается 3 раза Description:, мне нужен только тот что в блоке "Общая информация", при чем до этого забрав "Номер нарушения"

Первый Description: я исключил перемотав до блока "Общая информация" так:
Suppress(ZeroOrMore(Word(_printables + ' ') + SkipTo(Word('*')+CaselessKeyword('Общая информация')+Word('*'))))


Если я после OneOrMore(_onsource_ts) добавляю перемотку так:
| OneOrMore(_onsource_ts) \
+ Suppress(OneOrMore(Word(_printables + ' ') + SkipTo(Word('*'))))

То результат не меняться.
А если делаю через OR
| OneOrMore(_onsource_ts) \
| Suppress(OneOrMore(Word(_printables + ' ') + SkipTo(Word('*'))))

То результат таков:

[[], ['Description:', 'Сервер БД ']]


Помогите понять, что я не так делаю?
  • Вопрос задан
  • 55 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@Radavan
Python наше все!
[['Номер нарушения:', '82364311'],
['Description:', 'OTR.WIN.CASE04: Windows Multiple Network Logins'],
['Дата и время обнаружения нарушения ИБ:', '2019-11-09 11:33:29'],
['Description:', 'Сервер БД ']] - это список, просто выбери элемент этого списка по индексу - 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы