Pyparsing:dblQuotedString在nestedExpr中的解析方式不同

时间:2017-04-10 21:51:32

标签: python pyparsing

我正在研究语法来解析搜索查询(不评估它们,只是将它们分解成组件)。现在我正在使用nestedExpr,只是为了获取每个术语的不同“级别”,但如果术语的第一部分是双引号,我似乎有问题。

语法的简单版本:

QUOTED = QuotedString(quoteChar = '“', endQuoteChar = '”', unquoteResults = False).setParseAction(remove_curlies)
WWORD = Word(alphas8bit + printables.replace("(", "").replace(")", ""))
WORDS = Combine(OneOrMore(dblQuotedString | QUOTED | WWORD), joinString = ' ', adjacent = False)
TERM = OneOrMore(WORDS)
NESTED = OneOrMore(nestedExpr(content = TERM))

query = '(dog* OR boy girl w/3 ("girls n dolls" OR friends OR "best friend" OR (friends w/10 enemies)))'

致电NESTED.parseString(query)返回:

[['dog* OR boy girl w/3', ['"girls n dolls"', 'OR friends OR "best friend" OR', ['friends w/10 enemies']]]]

第一个dblQuotedString实例在相同的嵌套中与术语的其余部分分开,第二个dblQuotedString实例不会发生这种情况,如果引用的位是一个QUOTED实例(带有引号),而不是dblQuotedString直的实例。

我遗失了dblQuotedString的特别之处吗?

注意:我知道operatorPrecedence可以分解这样的搜索字词,但我对可分解的内容有一些限制,所以我正在测试是否可以使用nestedExpr来解决那些限制。

1 个答案:

答案 0 :(得分:2)

nestedExpr接受一个可选的关键字参数ignoreExpr,取一个nestedExpr应该用来忽略否则会被解释为嵌套开启器或闭包器的字符的表达式,默认为pyparsing的quotedString,定义为sglQuotedString | dblQuotedString。这是为了处理像:

这样的字符串
(this has a tricky string "string with )" )

由于默认ignoreExprquotedString,因此引号中的')'不会被误解为右括号。

但是,您的content参数也与dblQuotedString匹配。引导的字符串由nestedExpr在内部通过跳过可能包含“()”s的引用字符串进行匹配,然后匹配您的内容,这也匹配引用的字符串。您可以使用nestedExpr

来取消NoMatch的忽略表达式
NESTED = OneOrMore(nestedExpr(content = TERM, ignoreExpr=NoMatch()))

现在应该给你:

[['dog* OR boy girl w/3',
 ['"girls n dolls" OR friends OR "best friend" OR', ['friends w/10 enemies']]]]

您可以在https://pythonhosted.org/pyparsing/pyparsing-module.html#nestedExpr

找到更多详细信息和示例