2017-04-10 12 views
1

検索クエリを解析するための文法に取り組んでいます(評価していない、コンポーネントに分解する)。今、私はnestedExprと仕事しています。それぞれの用語のさまざまなレベルをつかむためですが、用語の最初の部分が二重引用符で囲まれていると問題があるようです。構文解析:nestedExprでdblQuotedStringの構文解析が異なります

文法の単純なバージョン:

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

最初dblQuotedStringインスタンスがない同じネスティングにおける用語の残りの部分から分離されている:

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)リターンを呼び出します2番目のdblQuotedStringインスタンスに発生し、引用されたビットがdblQuotedStringではなく、QUOTEDインスタンス(中括弧付き引用符)の場合は発生しません。

dblQuotedStringには何か特別なものがありますか?

注:operatorPrecedenceはこのような検索用語を分割することができますが、何が壊れているのかにはいくつかの制限がありますので、nestedExprを使用してこれらの制限内で作業することができます。

答えて

1

nestedExprnestedExprがそうでなければ、ネストオープナーもしくはクローザーとして解釈される文字を無視するために使用する式を取るために、オプションのキーワード引数ignoreExprをとり、デフォルトはのquotedStringsglQuotedString | dblQuotedStringとして定義されているがpyparsingています。これは、のような文字列処理することです:デフォルトignoreExprquotedStringあるので、引用符で「)」、

(this has a tricky string "string with)") 

は閉じ括弧と誤解されていません。

ただし、contentの引数もdblQuotedStringと一致します。引用符で囲まれた先頭の文字列は、 "()"を含む引用符付きの文字列をスキップすることにより、内部でnestedExprと一致し、内容は一致し、引用符付きの文字列と一致します。あなたはNoMatchを使用して式を無視nestedExpr年代を抑制することができます

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

+0

ああ、で、より多くの詳細と例を見つけることができます、それは理にかなっている。本当にありがとう! – allonsyechoes