2014-05-21 4 views
0

dicts의 목록에 문자열을 구문 분석 :나는이처럼 보이는 문자열을

POLYGON ((148210.445767647 172418.761192525, 148183.930888667 172366.054787545, 148183.866770629 172365.316772032, 148184.328078148 172364.737139913, 148220.543522168 172344.042601933, 148221.383518338 172343.971823159), (148221.97916844 172344.568316375, 148244.61381946 172406.651932395, 148244.578100039 172407.422441673, 148244.004662562 172407.938319453, 148211.669446582 172419.255646473, 148210.631989339 172419.018894911, 148210.445767647 172418.761192525))

난 쉽게 숫자에 초점을 문자열에서 POLYGON을 제거 할 수 있지만 나는 좀 궁금하네요 무엇 이 문자열을 dict 목록으로 파싱하는 가장 쉽고/좋은 방법이 될 것입니다.

첫 번째 괄호 (POLYGON 바로 다음)는 여러 요소를 제공 할 수 있음을 나타냅니다 (쉼표 ,으로 구분).

따라서 각 쌍의 숫자는 각각 xy입니다.

내가 ( python 2.7를 사용하여) 다음과 같은 데이터 구조 결국이 문자열을 구문 분석 싶습니다 점

list [ //list of polygons 
    list [ //polygon n°1 
    dict { //polygon n°1's first point 
     'x': 148210.445767647, //first number 
     'y': 172418.761192525 //second number 
    }, 
    dict { //polygon n°1's second point 
     'x': 148183.930888667, 
     'y': 148183.930888667 
    }, 
    ... // rest of polygon n°1's points 
    ], //end of polygon n°1 
    list [ // polygon n°2 
    dict { // polygon n°2's first point 
     'x': 148221.9791684, 
     'y': 172344.568316375 
    }, 
    ... // rest of polygon n°2's points 
    ] // end of polygon n°2 
] // end of list of polygons 

다각형 '수는 사실상 무한하다.
각 포인트의 번호는 공백으로 구분됩니다.

루프 나 반복적 인 방식으로이 작업을 수행하는 방법을 알고 계십니까?

추신 : 나는 일종의 비단뱀 초심자이다. (내 벨트 아래 몇 달 밖에 안되기 때문에) 자세히 설명하는 것을 망설이지 말라. 고맙습니다!

+0

문자열 '와 같은 문자열 메커니즘을 사용하고 내 마음에 오는 유일한 해결책 [XX : XX]'또 다시 함께 string.index'와 ('문자 ')'하지만 난 그렇게 본 적이 파이썬 devs에서 많은 예쁜 솔루션 그래서 내가 거기에 더 예쁜 솔루션이 있어야합니다 믿습니다.나는 사람들이 실제로 나를 위해 일하도록 요구하는 것이 아니지만, 한두 가지가 굉장 할 것입니다. –

답변

1

시도해 볼 수 있습니까?

import ast 

POLYGON = '((148210.445767647 172418.761192525, 148183.930888667 172366.054787545, 148183.866770629 172365.316772032, 148184.328078148 172364.737139913, 148220.543522168 172344.042601933, 148221.383518338 172343.971823159), (148221.97916844 172344.568316375, 148244.61381946 172406.651932395, 148244.578100039 172407.422441673, 148244.004662562 172407.938319453, 148211.669446582 172419.255646473, 148210.631989339 172419.018894911, 148210.445767647 172418.761192525))' 
new_polygon = '(' + POLYGON.replace(', ', '),(').replace(' ', ',') + ')' 


data = ast.literal_eval(new_polygon) 
result_list = list() 
for items in data: 
    sub_list = list() 
    for item in items: 
     sub_list.append({ 
      'x': item[0], 
      'y': item[1] 
     }) 
    result_list.append(sub_list) 

print result_list 
+1

'ast.literal_eval'을'eval'보다 사용하는 것이 훨씬 안전합니다. – GWW

+0

예 .thx @GWW. – mccakici

+0

3 번 줄에'POLYGON.replace ('POLYGON', '')'을 추가하고이 작업을 완벽하게 할 수있었습니다 ('POLYGON ((... 123)로 시작하는 문자열로. @ GWW와 @ 맥카시. –

1

는 (u는이

되는 my_str = 'POLYGON ((148210.445767647 172418.761192525, 148183.930888667 172366.054787545, 148183.866770629 172365.316772032, 148184.328078148 172364.737139913, 148220.543522168 172344.042601933, 148221.383518338 172343.971823159)과 같은 문자열이 있다고 148221.97916844 172344.568316375, 148244.61381946 172406.651932395을 수 있습니다 148244.578100039 172407.422441673, 148244.004662562 172407.938319453, 148211.669446582 172419.255646473, 148210.631989339 172419.018894911, 148210.445767647 172418.761192525)) '

my_str = my_str.replace('POLYGON ', '') 
coords_groups = my_str.split('), (') 

for coords in coords_groups: 
    coords.replace('(', '').replace(')', '') 
    coords_list = coords.split(', ') 
    coords_list2 = [] 
    for item in coords_list: 
     item_split = item.split(' ') 
     coords_list2.append({'x', item_split[0], 'y': item_split[1]}) 

나는이 그러는해야한다고 생각 PA는 작은

u는 지금 필요한 모든

이는 https://stackoverflow.com/users/2635860/mccakici에 의해 다른 답변에 감사 위 Regular expression to return text between parenthesis

UPDATE 업데이트 된 코드를 도움이 될 것입니다 괄호 사이의 정보를 얻을 수있는 방법이지만,이 유 문자열의 구조를 가지고있는 경우에만 작동합니다 귀하의 질문에 말했듯이

+0

나는 네가'my_str'에 가지고있는 몇 가지 문자열을 줄이는 방법을 찾을 수있을 것 같아. 감사! –

+0

내가이 권리를 얻으면,'POLYGON ('''부분을 떼어 낸 다음'')'을 제거한 다음 my_str.split ('), (')을 사용하여 답안에 노출 된 것처럼 여러 문자열로 범위를 좁힐 수 있습니다 . 이건 옳을 거예요, 그렇지 않아야합니까? :) –

+0

업데이트 된 코드, 새 버전 확인 –

2

Polygon 객체를 정의한 데이터 구조는 파이썬 튜플 선언과 매우 유사합니다. 하나의 옵션, 비록 약간의 해키 파이썬의 AST parser을 사용하는 것입니다.

POLYGON 부분을 제거해야하며이 솔루션은 다른 선언문에서는 더 이상 작동하지 않을 수 있습니다.

import ast 
your_str = "POLYGON (...)" 
# may be better to use a regex to split off the class part 
# if you have different types 
data = ast.literal_eval(your_str.replace("POLYGON ","")) 
x, y = data 
#now you can zip the two x and y pairs together or make them into a dictionary 
+0

'x, y = data' 부분을 이해할 수 없습니다. x와 y는 문자열/숫자의 목록일까요? 그래서 루프를 사용하면 사전을 만들 수 있습니까? 또한 문자열에 둘 이상의 다각형이 정의되어있는 경우 첫 번째 중지 지점과 두 번째 시작 지점을 어떻게 알 수 있습니까? –

+1

@MichaelDeKeyser : 죄송합니다. 'x, y = data'부분은'x = data [0]'과'y = data [1]'의 줄임말입니다. 'x와 y'는 모두 부동 소수점리스트를 담고 있습니다. – GWW

관련 문제