2013-09-23 4 views
3

파이썬리스트에 lisp 입력을 구문 분석하려고합니다. 그러나 입력을 구문 분석 할 때 문자열 목록을 얻지 만 개별 요소를 int로 원합니다.파이썬에 Lisp 입력을 입력 할 때의 문제점

예 : I 입력 다음 구문 분석 할 때 : "(2 (10 (5 11))) (5 6) (4)" 출력 : [[['2'], ['10', '5']], [['5'], ['6']], [['4']]]

내가 사용 [[map(int, x) for x in lst] for lst in test]int로 문자열을 변환 할 수 있지만,이 기능은 레벨 2의 중첩 된 목록을 구문 분석하지만 것입니다 내가 중첩 된 목록이있는 경우 2 개 이상인 경우 구문 분석에 어떻게 사용해야합니까?

필자는 pyparsing을 시도했지만 제대로 이해하지 못했습니다.

+1

사용한 구문 분석 코드를 표시 할 수 있습니까? 최선의 해결책은 사후 처리 단계가 아닌 변경을 포함 할 것입니다. – user2357112

+0

pyparsing에서 구문 분석 작업을 첨부하여 구문 분석 할 때 정수 문자열 대 int 변환을 수행 할 수 있습니다. pyparsing wiki에 대한 http://pyparsing.wikispaces.com/file/view/chemicalFormulas.py/31041705/chemicalFormulas.py 예제를 살펴보십시오. 해석기의 내부 버전 2에서'convertIntegers' 메소드가'integer' 표현식에 어떻게 첨부되는지보십시오. 나중에 사후 처리 할 필요없이 구문 분석시 문자열 - 변환을 수행합니다. – PaulMcG

답변

2

당신이 대한 파싱을 사용하려면, 다음과 같이 후 처리없이 그렇게 할 수 있습니다.

import pyparsing as pp 

integer = pp.Word(pp.nums).setParseAction(lambda m:int(m[0])) 
expr = pp.Forward() 
expr << pp.nestedExpr(content=pp.OneOrMore(integer | expr)) 
manyExpr = pp.OneOrMore(expr) 

print manyExpr.parseString('(2 (10 (5 11))) (5 6) (4)') 
    #returns [[2, [10, [5, 11]]], [5, 6], [4]] 

첫 번째는 숫자로만 구성된 것이 아니라 정수를 정의하고, 정수 객체에 숫자의 문자열로 변환하는 방법에 대한 파싱 알려줍니다. 다음으로 식을 괄호 안에있는 식 또는 정수 목록으로 정의합니다. 마지막으로, 예제를 구문 분석하기 위해 많은 연속 식을 찾습니다.

+0

'nestedExpr'이 내부적으로 내용의 반복과 중첩을 처리한다는 것을 인식하는 것이 더 간단합니다. 단지'expr'을'expr = pp.nestedExpr (content = integer)'로 정의하십시오. (구문 분석 작업을 사용하면 구문 분석 시간에 숫자 문자열을 정수로 변환 할 수 있으며 btw 또한 전반적인 구문 분석기의 구성에 대한 요약 설명이 유용합니다.) – PaulMcG

5
def as_int(xs): 
    if isinstance(xs, list): 
     return map(as_int, xs) 
    elif isinstance(xs, str): 
     return int(xs) 
    return xs 

사용법 :

>>> xs = [[['2'], ['10', '5']], [['5'], ['6']], [['4']]] 
>>> print as_int(xs) 
[[[2], [10, 5]], [[5], [6]], [[4]]] 
+0

고마워요 @falsetru. – Satsung