解析异常:预期文本结束
我正在使用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官网的常见问题解答,如果我想让解析器解析整个字符串,我应该在我的语法中加入StringEnd(),或者使用可选参数parseAll=True。如果我把代码中的parseAll=True去掉,它就能工作,但就不能解析整个字符串了。
有没有什么想法?
2 个回答
6
如果你不想用 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
可以把pyparsing想象成一种更高级的正则表达式。当你设置parseAll=True
时,它会期待整个字符串都能匹配,也就是说,字符串中的每一个字节都要符合某种语法规则。不过,你的语法规则只提到了字符串中会出现的一部分单词。你需要想办法处理剩下的那些单词。
换句话说,假设一些常见的单词是“鹦鹉”、“气垫船”、“鳗鱼”和“峡湾”,那么你实际上构建的就是以下这个正则表达式的等价物:
/^(?P<dict_words>eels|fjords|hovercraft|parrot)*$/