Как получить целую строку, содержащую несколько ключевых слов, путем разбора? - PullRequest
2 голосов
/ 11 ноября 2019

Я использую pyparsing для разбора файлов журнала. Я хочу получить всю строку, которая содержит ключевые слова:

  • Input/Output error
  • Disk full
  • Quota Exceeded

Мой код ниже:

import pyparsing as pp
line = pp.Combine(pp.Regex(".*") + pp.CaselessLiteral("Input/Output error") ^ \
       pp.CaselessLiteral("Disk full") ^ pp.CaselessLiteral("Quota Exceed") + \ 
       pp.Regex(".*"))

В результате совпадения он содержит только ключевое слово, например "Disk full". Он не получает всю строку.

Кто-нибудь знает, как получить всю строку в результате?

1 Ответ

1 голос
/ 11 ноября 2019

Попробуйте прикрепить это действие синтаксического анализа к line:

def return_containing_line(s, l, t):
    # use pyparsing line builtin to extract the current line text
    # at location 'l' in input string 's'
    return pp.line(l, s)
line.addParseAction(return_containing_line)

Этот синтаксический анализатор действительно работает? Я бы подумал, что ведущий Regex будет занимать всю строку, так как он не обращает внимания на следующие буквенные выражения. Почему бы не отбросить условия Regex и просто использовать searchString? Или, если вы используете scanString, вы получите кортеж (tokens, startloc, endloc) для каждого совпадения, и вы можете просто вызвать pp.line, используя startloc и входную строку, и вам даже не понадобится действие parse.

...