중첩 된 표현식은 매우 일반적이므로 구문 분석 라이브러리를 사용하지 않는 경우 일반적으로 재귀 구문 분석기 정의 또는 재귀 코드가 필요합니다. 이 코드는 초보자에게는 어려울 수 있으며 전문가에게는 오류가 발생하기 쉽기 때문에 nestedExpr
헬퍼를 pyparsing에 추가했습니다.
문제는 입력 문자열에 중첩 된 중괄호 표현식 이상이 있다는 것입니다. 파서를 처음 시도 할 때 테스트를 가능한 한 간단하게 유지하려고합니다. 예를 들어 파일에서 읽는 대신 샘플을 인라인합니다.
test = """\
Continent
{
Name Europe
Country
{
Name UK
Dog
{
Name Fiffi
Colour "light Gray"
}
Dog
{
Name Smut
Colour Black
}}}"""
from pyparsing import *
expr = nestedExpr('{','}')
print expr.parseString(test).asList()
그리고 난 당신이 같은 구문 분석 오류 얻을 :
Traceback (most recent call last):
File "nb.py", line 25, in <module>
print expr.parseString(test).asList()
File "c:\python26\lib\site-packages\pyparsing-1.5.7-py2.6.egg\pyparsing.py", line 1006, in parseString
raise exc
pyparsing.ParseException: Expected "{" (at char 1), (line:1, col:1)
그래서, 대한 파싱은 주요 단어에 걸림돌입니다 (심지어는 자신의 디버깅 코드) 오류 메시지를보고 "대륙을 ",이 단어는 중괄호 안에 중첩 된 표현식의 시작이 아니기 때문에 예외 메시지에서 볼 수 있듯이 pyparsing은 '{'을 (를) 찾고 있습니다.
이 솔루션은 약간에 EXPR을 변경하여 소개 "대륙"라벨을 처리하는 파서를 수정하는 것입니다 : 영업에서 수행으로, 이제
expr = Word(alphas) + nestedExpr('{','}')
pprint를 사용하여 목록 (로 결과를 인쇄 멋진 작품)은 다음과 같습니다.
['Continent',
['Name',
'Europe',
'Country',
['Name',
'UK',
'Dog',
['Name', 'Fiffi', 'Colour', '"light Gray"'],
'Dog',
['Name', 'Smut', 'Colour', 'Black']]]]
중괄호와 일치해야합니다.
주제에서 벗어나지 만, 파이썬에서 예약되어 있으므로'list'를 변수 이름으로 사용하지 않는 것이 좋습니다 – oleg
재귀 기반 알고리즘으로 You 솔루션을 제안 할 수 있습니다. 그것은 귀하의 요구 사항에 맞습니까 ('{'once와 rsplit '}'로 한 번 전체 데이터 분할. 외부 부분은 반환 된 사전에 대한 키 - 값으로 구문 분석되어야하고 내부 부분은 재귀 함수 자체에 전달되어야합니다. .) – oleg
결과로 무엇이 좋을지 보여주십시오. –