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