Помогите понять этот 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:', 'Сервер БД ']]
Помогите понять, что я не так делаю?