2017-12-31 62 views
1

다음은 SQL 문을 사용하여 괄호와 쉼표없이 select_parser.py example을 사용하여 다시 인쇄하는 일부 pyparsing 코드의 예제입니다. 그들을 되 찾을 수있는 가장 쉬운 방법은 무엇입니까? pyparsing select_parser.py에서 괄호와 쉼표를 다시 가져 오는 방법은 무엇입니까?

LPAR='(' 
RPAR=')' 
COMMA=',' 

그럼 내가이 있기 때문이라고 생각 :

그래서 내가 그들을 수정
LPAR,RPAR,COMMA = map(Suppress,"(),") 

이 상징으로 정의 할 수 :

나는 그들이 정의 되었기 때문에 다음과 같이 쉼표와 괄호를 떨어 생각 쉼표를 삭제하는 delimitedList 요소 따라서 구분 된 모든 목록의 이름을 지정하고 ParseResult에 이름이 있으면 쉼표를 다시 삽입했습니다. (??를 ParseResult 더 일반적으로 구분 된 목록의 경우, 또는 감지 할 수있는 쉬운 방법은 익명의 요소에 대해 무엇을 것입니다 내가 getName()를 볼 수 있지만, 어떤 요소가 있습니까?)

편집 : This example 쇼가 구분 된 목록을 융합 ','. 그럼에도 불구하고 나는 문법의 모든 예를 바꾸어야한다. 그리고 형식화를위한 문법을 ​​바꾸는 것이 이상하다고 느낀다. 이상적으로 말하면, "구분 된 목록마다 쉼표를 다시 붙이십시오."라고 말할 수 있습니다.

그러나 괄호를 어떻게 억제합니까?

P. 모두 잘되면 SQL 형식 작성기로가는 중이므로 모든 결과를 출력하고 싶습니다.

코드 :

#!/usr/bin/env python 

from select_parser import select_stmt 
from pyparsing import ParseResults 

def struct_to_list(struct): 
    elems = [] 
    for elem in struct: 
     if isinstance(elem, ParseResults): 
      elems.extend(struct_to_list(elem)) 
     else: 
      elems.append(elem) 
    return elems 


stmt = "select (1 and 2) or 3 as one, 4 as two from b" 
print struct_to_list(select_stmt.parseString(stmt)) 

select_stmt.runTests(stmt) 

출력 :

['SELECT', '1', 'AND', '2', 'OR', '3', 'AS', 'one', '4', 'AS', 'two', 'FROM', 'b'] 

select (1 and 2) or 3 as one, 4 as two from b 
['SELECT', [[[['1', 'AND', '2'], 'OR', '3'], 'AS', 'one'], ['4', 'AS', 'two']], 'FROM', 'b'] 
- columns: [[[['1', 'AND', '2'], 'OR', '3'], 'AS', 'one'], ['4', 'AS', 'two']] 
    [0]: 
    [[['1', 'AND', '2'], 'OR', '3'], 'AS', 'one'] 
    [0]: 
     [['1', 'AND', '2'], 'OR', '3'] 
     [0]: 
     ['1', 'AND', '2'] 
     [1]: 
     OR 
     [2]: 
     3 
    [1]: 
     AS 
    [2]: 
     one 
    [1]: 
    ['4', 'AS', 'two'] 
- from: ['b'] 
- table: [['b']] 
    [0]: 
    ['b'] 

답변

0

당신은 originalTextFor를 사용하여 원래 사전 구문 분석 텍스트를 캡처 할 수 있습니다. 다음은 관찰 delimitedList를 사용하여 간단한 예는 구분 기호를 제거하고 바로 구문 분석 목록 항목 반환

source = "1,2,3, 4,5" 

import pyparsing as pp 
expr = pp.delimitedList(pp.pyparsing_common.integer) 
print(expr.parseString(source)) 

가 제공합니다 :

[1, 2, 3, 4, 5] 

(pyparsing_common.integer는 변환 첨부 구문 분석 작용을합니다을 문자열 값을 int로 변환하므로 문자열 1, 2, 3이 아닌 문자열 "1", "2", "3"등이 아님)

originalTextFor으로 표현식을 래핑하면 원래 파싱 된 텍스트.

print(pp.originalTextFor(expr).parseString(source)) 

가 제공합니다 :

['1,2,3, 4,5'] 
+0

내가 당신의 대답을 주셔서 감사합니다 전자 구문 분석하는 동안 건너 뛴 공백을 포함됩니다. 미리 파싱 된 텍스트를 복구하고 싶지는 않습니다. 예쁜 프린터를 만들고 있기 때문에 나는 꽤 표준화 된 텍스트를 원합니다. 오히려 파서가 토큰 (쉼표 또는 괄호)을 삭제하지 못하도록하고 싶습니다. 나는 괄호와 쉼표로 "select (1 and 2) or 3 as b, four from two from b"를 개혁 할 수 있기를 원하지만, 아마도 한 줄에 하나의 필드를 넣고 모든 키워드를 대문자로 만들 것입니다. 등 – dfrankow