我正在研究语法来解析搜索查询(不评估它们,只是将它们分解成组件)。现在我正在使用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
来解决那些限制。
答案 0 :(得分:2)
nestedExpr
接受一个可选的关键字参数ignoreExpr
,取一个nestedExpr
应该用来忽略否则会被解释为嵌套开启器或闭包器的字符的表达式,默认为pyparsing的quotedString
,定义为sglQuotedString | dblQuotedString
。这是为了处理像:
(this has a tricky string "string with )" )
由于默认ignoreExpr
为quotedString
,因此引号中的')'不会被误解为右括号。
但是,您的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
找到更多详细信息和示例