ParseException:预期的文本结束



我正在尝试使用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中的FAQ,如果我希望解析器解析整个字符串,我应该将StringEnd()放在语法中,或者使用可选参数parseAll=True。如果我从我的代码中删除parseAll=True,它工作,但它不解析整个字符串。

任何想法?

您可能对使用scanStringsearchString而不是parseString更感兴趣。与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]

可以把pyparsing看作一个更高级的正则表达式。当您将parseAll=True传递给它时,它期望匹配整个字符串,将每个字节限定为语法的某些部分。然而,你的语法只提到将出现在字符串中的一些单词。你得想办法解释其余的。

换句话说,假设流行的词是"鹦鹉"、"气垫船"、"鳗鱼"one_answers"峡湾",您已经构建了一个等价于以下正则表达式的表达式:

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

最新更新