ParseException: ожидаемый конец текста - PullRequest
2 голосов
/ 26 сентября 2011

Я пытаюсь разобрать текст с помощью pyparsing. Моя функция показана ниже. Во-первых, я создаю список, содержащий все термины в моем словаре (словарь часто используемых терминов на моем веб-сайте). Затем я установил свою грамматику в этот список часто используемых слов. Затем я создаю объект ZeroOrMore с помощью грамматики. Наконец, я анализирую строку и должен найти совпадения, найденные в моей строке. Однако вместо этого он выдает исключение ParseException с жалобой на ожидаемый конец текста.

def map_dict_words(self, pbody):
        dict_terms = [term.term for term in Dictionary.objects()]
        look_for_these = oneOf(dict_terms, caseless=True).setResultsName("dict_words")
        parseobj = ZeroOrMore(look_for_these)
        matches = parseobj.parseString(pbody, parseAll=True)
        print matches

В соответствии с часто задаваемыми вопросами на домашней странице pyparsing http://pyparsing -public.wikispaces.com / FAQs если я хочу, чтобы синтаксический анализатор проанализировал всю строку, я должен либо включить StringEnd () в мою грамматику, либо использовать необязательный arg parseAll = True. Если я удаляю parseAll = True из моего кода, он работает, но не анализирует всю строку.

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 27 сентября 2011

Вместо parseString вы можете быть более заинтересованы в использовании scanString или searchString.В отличие от parseString, эти функции просматривают ввод, ища совпадения, вместо того, чтобы требовать полного совпадения всего содержимого входной строки.scanString возвращает генератор, поэтому для большого входного текста вы найдете совпадения в том виде, в котором они были найдены:

for toks,start,end in look_for_these.scanString(pbody):
    print toks[0], start, end

searchString - это простая оболочка вокруг scanString (удаляет начальные и конечные местоположения,хотя):

for t in look_for_these.searchString(pbody):
    print t[0]
4 голосов
/ 27 сентября 2011

Думайте о pyparsing как о более продвинутом регулярном выражении. Когда вы передаете его parseAll=True, он ожидает совпадения всей строки, квалифицируя каждый байт в какой-то части грамматики. Однако в вашей грамматике упоминаются только некоторые слова, которые появятся в строке. Вы должны как-то объяснить остальные из них.

Другими словами, предполагая, что популярными словами являются «попугай», «судно на воздушной подушке», «угри» и «фьорды», вы создали эквивалент следующего регулярного выражения:

/^(?P<dict_words>eels|fjords|hovercraft|parrot)*$/
...