). Я пытался удалить его, но потом просто разобрал первое слово

я есть несколько предложений, которые мне нужно проанализировать и преобразовать в соответствующий код поиска регулярных выражений. Примеры моих предложений -

LINE_CONTAINS phrase one BEFORE {phrase2 AND phrase3} AND LINE_STARTSWITH Therefore we

-Это значит в строке,phrase one приходит где-то раньшеphrase2 а такжеphrase3, Также строка должна начинаться сTherefore we

LINE_CONTAINS abc {upto 4 words} xyz {upto 3 words} pqr

-Это означает, что мне нужно разрешить до 4 слов между первыми 2 фразами и до 3 слов между последними 2 фразами

Используя помощь от Пола Макгуайра (Вот), была написана следующая грамматика -

from pyparsing import (CaselessKeyword, Word, alphanums, nums, MatchFirst, quotedString, 
    infixNotation, Combine, opAssoc, Suppress, pyparsing_common, Group, OneOrMore, ZeroOrMore)

LINE_CONTAINS, LINE_STARTSWITH = map(CaselessKeyword,
    """LINE_CONTAINS LINE_STARTSWITH """.split()) 

NOT, AND, OR = map(CaselessKeyword, "NOT AND OR".split())
BEFORE, AFTER, JOIN = map(CaselessKeyword, "BEFORE AFTER JOIN".split())

lpar=Suppress('{') 
rpar=Suppress('}')

keyword = MatchFirst([LINE_CONTAINS, LINE_STARTSWITH, LINE_ENDSWITH, NOT, AND, OR, 
                      BEFORE, AFTER, JOIN]) # declaring all keywords and assigning order for all further use

phrase_word = ~keyword + (Word(alphanums + '_'))

upto_N_words = Group(lpar + 'upto' + pyparsing_common.integer('numberofwords') + 'words' + rpar)

phrase_term = Group(OneOrMore(phrase_word) + ZeroOrMore((upto_N_words) + OneOrMore(phrase_word))  



phrase_expr = infixNotation(phrase_term,
                            [
                             ((BEFORE | AFTER | JOIN), 2, opAssoc.LEFT,), # (opExpr, numTerms, rightLeftAssoc, parseAction)
                             (NOT, 1, opAssoc.RIGHT,),
                             (AND, 2, opAssoc.LEFT,),
                             (OR, 2, opAssoc.LEFT),
                            ],
                            lpar=Suppress('{'), rpar=Suppress('}')
                            ) # structure of a single phrase with its operators

line_term = Group((LINE_CONTAINS | LINE_STARTSWITH | LINE_ENDSWITH)("line_directive") + 
                  Group(phrase_expr)("phrase")) # basically giving structure to a single sub-rule having line-term and phrase
line_contents_expr = infixNotation(line_term,
                                   [(NOT, 1, opAssoc.RIGHT,),
                                    (AND, 2, opAssoc.LEFT,),
                                    (OR, 2, opAssoc.LEFT),
                                    ]
                                   ) # grammar for the entire rule/sentence

sample1 = """
LINE_CONTAINS phrase one BEFORE {phrase2 AND phrase3} AND LINE_STARTSWITH Therefore we
"""
sample2 = """
LINE_CONTAINS abcd {upto 4 words} xyzw {upto 3 words} pqrs BEFORE something else
"""

Мой вопрос сейчас - как мне получить доступ к проанализированным элементам, чтобы преобразовать предложения в мой код регулярного выражения. Для этого я попробовал следующее -

parsed = line_contents_expr.parseString(sample1)/(sample2)
print (parsed[0].asDict())
print (parsed)
pprint.pprint(parsed)

Результат приведенного выше кода дляsample1 было -

{}

[[['LINE_CONTAINS', [[['предложение', 'один'], 'ДО', [['предложение2'], 'И', ['предложение3']]]]], 'И', [' LINE_STARTSWITH ', [[' Следовательно ',' мы ']]]]]

([([(['LINE_CONTAINS', ([([(['предложение', 'один'], {}), "ДО", ([(['предложение2'], {}), "И", (['предложение3'], {})], {})], {})], {})], {'фраза': [(([([([«предложение», «один»], {}), «ДО», ([([«предложение 2»], {}), «И», ([«предложение 3»] , {})], {})], {})], {}), 1)], 'line_directive': [(' LINE_CONTAINS ', 0)]}),' AND ', ([' LINE_STARTSWITH ', ([([' Следовательно ',' мы '], {})], {})], {'фраза': [(([([' Следовательно ',' мы '], {})], {}), 1)],'line_directive': [(' LINE_STARTSWITH ', 0)]})], {})], {})

Результат приведенного выше кода дляsample2 было -

фраза': [[[' abcd ', {'число слов': 4},' xyzw ', {'число слов': 3},' pqrs '],' BEFORE ', [' что-то ',' else ']]],'line_directive':' LINE_CONTAINS '}

[['LINE_CONTAINS', [[['abcd', ['upto', 4, 'words'], 'xyzw', ['upto', 3, 'words'], 'pqrs'], 'BEFORE', ['что-то другое']]]]]

([(['LINE_CONTAINS', ([([(['abcd', (['upto', 4, 'words'], {'число слов': [(4, 1)]}),' xyzw ', ([' upto ', 3,' words '], {'число слов': [(3, 1)]}),' pqrs '], {}),' BEFORE ', ([' что-то ',' else '], {})], {})], {})] , {'фраза': [(([([([abcd ', ([' upto ', 4,' words '], {'число слов': [(4, 1)]}),' xyzw ', ([' upto ', 3,' words '], {' numberofwords ': [(3, 1)]}),' pqrs '], { }), 'ДО', (['что-то', 'еще'], {})], {})], {}), 1)], 'line_directive': [(' LINE_CONTAINS ', 0)]})], {})

Мои вопросы, основанные на приведенном выше выводе:

Почему у отпечатка (симпатичная печать) есть более детальный анализ, чем у обычной печати?ПочемуasDict() метод не дает вывод дляsample1 но делает дляsample2?Всякий раз, когда я пытаюсь получить доступ к проанализированным элементам, используяprint (parsed.numberofwords) или жеparsed.line_directive или жеparsed.line_term, это ничего не дает мне. Как я могу получить доступ к этим элементам, чтобы использовать их для создания моих кодов регулярных выражений?

Ответы на вопрос(1)

Ваш ответ на вопрос