). Я пытался удалить его, но потом просто разобрал первое слово
я есть несколько предложений, которые мне нужно проанализировать и преобразовать в соответствующий код поиска регулярных выражений. Примеры моих предложений -
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
, это ничего не дает мне. Как я могу получить доступ к этим элементам, чтобы использовать их для создания моих кодов регулярных выражений?