2017-04-03 5 views
1

I는 다음의 샘플 데이터가 (각 행 열의 동일한 양이없는 것을 제외하고)대한 파싱 이차원리스트

165 150 238 402 395 571 365 446 284 278 322 282 236 
16 5 19 10 12 5 18 22 6 4 5 
259 224 249 193 170 151 95 86 101 58 49 
6013 7413 8976 10392 12678 9618 9054 8842 9387 11088 11393; 

이것은 이차원 어레이의 등가이다. 각 행의 끝에는 공백이 있고 그 다음에 공백이없는 마지막 항목과 ; 만 제외하고는 \n입니다.

누구나 구문 분석을 위해 pyparsing 문법을 알고 있습니까? 나는 다음 라인을 따라 뭔가를 시도해 왔지만 일치하지 않을 것이다. 어떤 도움을 크게 감상 할 수있다

[['165', '150', '238', '402', '395', '571', '365', '446', '284', '278', 
'322', '282', '236'], ['16', '5', ... ], [...], ['6013', ..., '11393']] 

을 다음과 같이

data = Group(OneOrMore(Group(OneOrMore(Word(nums) + SPACE)) + LINE) + \ 
      Group(OneOrMore(Word(nums) + SPACE)) + Word(nums) + Literal(";") 

원하는 출력은 이상적 일 것이다.

+0

당신이 특별히 대한 파싱 사용해야합니까? –

+0

기술적으로는이 부분이 아니라는 것을 의미합니다. 그러나 나머지 부분은이 파일을 사용하고 있습니다. 정확히 찾고있는 부분이 – user1599318

답변

2

stopOn 인수를 OneOrMore에 사용하면 일치를 중지 할 수 있습니다. 그런 다음, 줄 바꿈은 기본적으로 건너 뛸 수있는 공백이므로 다음 그룹이 일치를 시작할 수 있으며 줄 바꿈을 건너 뛰고 다음 정수에서 시작합니다.

import pyparsing as pp 

data_line = pp.Group(pp.OneOrMore(pp.pyparsing_common.integer(), stopOn=pp.LineEnd())) 
data_lines = pp.OneOrMore(data_line) + pp.Suppress(';') 

샘플 데이터에이 적용 :

data = """\ 
165 150 238 402 395 571 365 446 284 278 322 282 236 
16 5 19 10 12 5 18 22 6 4 5 
259 224 249 193 170 151 95 86 101 58 49 
6013 7413 8976 10392 12678 9618 9054 8842 9387 11088 11393;""" 

parsed = data_lines.parseString(data) 

from pprint import pprint 
pprint(parsed.asList()) 

인쇄 :

[[165, 150, 238, 402, 395, 571, 365, 446, 284, 278, 322, 282, 236], 
[16, 5, 19, 10, 12, 5, 18, 22, 6, 4, 5], 
[259, 224, 249, 193, 170, 151, 95, 86, 101, 58, 49], 
[6013, 7413, 8976, 10392, 12678, 9618, 9054, 8842, 9387, 11088, 11393]] 
+0

입니다. 정말 고맙습니다! – user1599318

+0

'pyparsing_common.integer'에는 string-to-int 변환을 수행하는 구문 분석 조치가 포함되어 있으므로 구문 분석 후 정수를 int로 사용할 수 있습니다. 원하는 것이 아니라면'pp.Word (pp.nums)'로 바꾸십시오. – PaulMcG