2017-04-10 7 views
1

검색 쿼리를 구문 분석하기 위해 문법 작업을하고 있습니다 (평가하지 않고 구성 요소로 분해). 지금은 nestedExpr으로 일하고 있는데, 각 용어의 각기 다른 '레벨'을 얻으려고합니다.하지만 용어의 첫 번째 부분이 큰 따옴표 안에 있으면 문제가있는 것 같습니다.Parsarsing : 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) 수익을 호출 두 번째 dblQuotedString 인스턴스에 발생하며, 인용 된 비트가 dblQuotedString이 아닌 QUOTED 인스턴스 (중괄호 포함) 인 경우에도 발생하지 않습니다.

dblQuotedString에 대한 특별한가요?

참고 : operatorPrecedence은 이와 같은 검색어를 해독 할 수 있지만 몇 가지 문제가있을 수 있습니다. 따라서 제한 범위 내에서 nestedExpr을 사용할 수 있는지 테스트하고 있습니다.

답변

1

nestedExprnestedExpr 달리 중첩 오프너 또는 클로저로 해석 될 것이다 문자를 무시 사용해야 표현을 위해, 선택적 키워드 인수 ignoreExpr 소요되며, 기본은의 quotedString, sglQuotedString | dblQuotedString로 정의된다을 대한 파싱된다. 이 같은 문자열을 처리하는 것입니다 : 기본 ignoreExpr 때문에

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

을 ')'따옴표는 닫는 괄호로 잘못 해석되지 않습니다 quotedString입니다.

그러나 content 인수는 dblQuotedString에도 일치합니다. 선행 인용 문자열은 내부적으로 nestedExpr과 일치하며 "()"를 포함 할 수있는 인용 문자열을 건너 뛴 다음 내용이 일치하며 인용 문자열도 일치합니다.

NESTED = OneOrMore(nestedExpr(content = TERM, ignoreExpr=NoMatch())) 

지금 당신에게 제공해야하는 : 당신은 nestedExpr의이 NoMatch 사용하여 식을 무시 억제 할 수 https://pythonhosted.org/pyparsing/pyparsing-module.html#nestedExpr

+0

아에

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

당신은 찾을 수 있습니다 자세한 내용과 예제를, 나는, 참조 그건 의미가 있습니다. 정말 고마워! – allonsyechoes