2010-11-20 2 views
1

필자는 연습으로 pyparsing을 사용하여 통합 된 diff 파일을 구문 분석하려고하는데 올바르게 할 수 없습니다. 여기에 저를 일으키는 내 사랑하는 파일의 부분은 괴롭게 :pyparsing을 사용하여 줄 시작 부분에 공백 맞추기

(... some stuff over...) 
banana 
+apple 
orange 

첫 번째 줄은 "다음"바나나 ""로 시작합니다. 나는 선 분석을 위해 다음 식을 가지고 : 한 줄을 구문 분석 할 때이 작동

linestart = Literal(" ") | Literal("+") | Literal("-") 
line = linestart.leaveWhitespace() + restOfLine 

을,하지만 전체 파일을 구문 분석하려고하면 "leaveWhitespace"명령은 마지막의 마지막에 파서 시작을 선. 나의 예에서는, "바나나"를 파싱 한 후, 다음 문자는 "\ n"(leaveWhitespace 때문에)이고 파서는 ""또는 "+"또는 "-"와 일치하려고하므로 오류가 발생합니다.

어떻게하면 올바르게 처리 할 수 ​​있습니까?

+0

을 지정할 수 있습니다! – PaulMcG

+0

그게 숙제가 아니에요, 나는 단지 잣대를 배우고 싶습니다. – subb

+0

http://pyparsing.wikispaces.com에서 wiki를 방문하십시오. 온라인 문서 및 기사에 대한 링크가 있습니다. 위키 홈 페이지의 토론 탭에 질문을 게시하십시오. pyparsing에 오신 것을 환영합니다! – PaulMcG

답변

1

한 번에 한 행을 읽고 파싱 할 수 있습니다. 다음 코드는 나를 위해 작동합니다.

from pyparsing import Literal, restOfLine 

linestart = Literal(" ") | Literal("+") | Literal("-") 
line = linestart.leaveWhitespace() + restOfLine 

f = open("/tmp/test.diff") 
for l in f.readlines(): 
    fields = line.parseString(l) 
    print fields 

그리고 출력은

[' ', 'banana'] 
['+', 'apple'] 
[' ', 'orange'] 

입니다 아니면 여러 줄을 구문 분석해야하는 경우, 당신은 명시 적으로 대한 파싱에 숙제를주는 LineEnd

linestart = Literal(" ") | Literal("+") | Literal("-") 
line = linestart.leaveWhitespace() + restOfLine + LineEnd() 
lines = ZeroOrMore(line) 
lines.parseString(f.read()) 
+0

예, 작동하지만 문제는 파일의 다른 부분에 다른 파서가 있다는 것입니다. 나는 나의 예가 조금 단순 해졌다는 것을 인정한다. 나는 원래 게시물에 몇 가지 세부 사항을 추가 할 것이다. – subb

+0

파일의 다른 내용과 비교해도 한 줄의 한 줄을 계속 파싱 할 수 있어야합니다. 그러나 전체 파일을 문자열로 구문 분석하는 방법을 포함하도록 답변을 업데이트했습니다. 나는 그것이 pplarsing에 새로운 사람이고 그것이 모범 사례인지 확실하지 않다라고 말해야한다. –

관련 문제