2014-01-13 2 views
-1

십진수로 표시된 여러 지리적 좌표 (예 : +12.324333333, -34.245322222)가 포함 된 매우 긴 문자열이 있습니다. 소수점 이하 자릿수를 줄이기 위해 파이썬으로 전체 문자열을 수정해야합니다.문자열에 포함 된 십진수 찾기 및 줄이기

이 좌표를 먼저 찾아서 변경해야합니다.

가장 빠르고 쉬운 방법은 무엇입니까?

편집

이 내가해야 할 일의 예입니다.

원래 문자열 :

‘… { "type": "MultiPolygon", 
    "coordinates": 
     [ 
     [ 
      [ 
      [ 29.051803589000372, 9.103446961000429 ], 
      [ 29.053974152000308, 9.100263596000389 ], 
      [ 29.052606582000124, 9.101751327000443 ]…’ 

수정 된 문자열 : 당신이 그것을 복사하여 초기 문자열을 변경하지 않으려면

‘…{ "type": "MultiPolygon", 
    "coordinates": 
    [ 
     [ 
     [ 
      [ 29.05, 9.10 ], 
      [ 29.05, 9.10 ], 
      [ 29.05, 9.10 ]…’ 
+2

무엇이 변경 되었습니까? – thefourtheye

+1

'소수점 이하 자릿수를 줄이기 위해 파이썬으로 문자열 전체를 수정하는 것'이란 정확히 무엇을 의미합니까? 예? – Jerry

+0

입력 형식과 원하는 출력 형식을 확인해야합니다. –

답변

1

import re 
for n in re.findall(r"[-+]?\d*\.\d+|\d+", yourStr): 
    yourStr = yourStr.replace(n, str(round(float(n), countDecimals))) 

시도 그런 다음 r을 사용하십시오. 장소. 귀하의 예를 들어 countDecimals는 2

UPDATE IDLE

>>> countDecimals = 2 
>>> yourStr = '…{ "type": "MultiPolygon", "coordinates": [ [ [ [ 29.051803589000372, 9.103446961000429 ], [ 29.053974152000308, 9.100263596000389 ], [ 29.052606582000124, 9.101751327000443 ]…' 
>>> import re 
>>> for n in re.findall(r"[-+]?\d*\.\d+|\d+", yourStr): 
    yourStr = yourStr.replace(n, str(round(float(n), countDecimals))) 


>>> yourStr 
'…{ "type": "MultiPolygon", "coordinates": [ [ [ [ 29.05, 9.1 ], [ 29.05, 9.1 ], [ 29.05, 9.1 ]…' 
>>> 

업데이트 2

문제에서

은 그 29.085363456418179 이 코드 >>> float('29.085363456418179') 반환 29.08536345641818

,

당신은 사용할 수 있습니다 진수

from decimal import * 

str(round(Decimal(n), countDecimals)) 

대신 또한

str(round(float(n), countDecimals)) 

나는 그 @stranac 한 줄에 다른 정규 표현식에 완벽한 솔루션을 제공 발견 할

re.sub(r'([-+]?\d*\.\d{2})\d+', r'\1', yourStr) 
+1

'str.replace'가 복사본을 반환하기 때문에'yourStr = yourStr.replace (n, str (round (float (n), countDecimals))')'이어야한다고 생각합니다. – Ray

+0

예, 맞습니다. 편집 해 드리겠습니다. –

+0

감사합니다. Ray, 거의 완벽하게 작동합니다. 이 경우처럼 는하지만 경우에 따라서는, 제대로 동작하지 않습니다 yourStr = ' "기능": [ "유형": "기능", "속성": { "STA_CODE": "81", "STATE" "Wrap"}, "geometry": { "type": "MultiPolygon", [29.085363456418179, 9.750404249641861], [29.082658973000207, 9.751562640000088], ' 오류가 어디에 있는지 알 수는 없지만 @Alex에 의해 제안 된 표현식을 조금이라도 사용하면 스크립트는 작동합니다. r "([+ -]? \ d + \. \ d +) \ s *, \ s * ([+ -]? \ d + \. \ d +) " – Andreampa

0

다음은 좌표 일치를위한 정규식입니다.

([+-]\d+\.\d+)\s*,\s*([+-]\d+\.\d+) 
1

그 문자열은 JSON처럼 보입니다. 이것이 실제로 유효한 JSON이라면 json 모듈을 사용하여이를 수행 할 수 있습니다.
단순화 된 예 :

>>> import json 
>>> original = """ 
... { 
... "type": "MultiPolygon", 
... "coordinates": [[ 29.051803589000372, 9.103446961000429 ], 
         [ 29.053974152000308, 9.100263596000389 ]] 
... } 
... """ 
>>> data = json.loads(original) 
>>> data['coordinates'] 
[[29.05180358900037, 9.10344696100043], [29.053974152000308, 9.100263596000389]] 
>>> data['coordinates'] = [[round(v, 2) for v in coordinate] 
          for coordinate in data['coordinates']] 
>>> changed = json.dumps(data) 
>>> changed 
'{"type": "MultiPolygon", "coordinates": [[29.05, 9.1], [29.05, 9.1]]}' 
+0

흥미로운 솔루션, 나는 문제의 예제를보기 전에 내 대답을 만들었습니다. 나는 그것이 json 문자열이라는 것을 몰랐습니다. 하지만 어쨌든 regexp를 사용하면 더 보편적입니다. –

0

방법에 대한이 솔루션은 또한 내가하지 않았다 @stranac에 의해 코멘트에 게시 한 그것은 나중에 나에게 지적 된 두 개의 소수

result = re.sub(r"(\d+\.\d\d)\d+", r"\1", subject) 

에 절단 제가 답변에 게시하기 직전에보십시오.

+0

댓글에 @stranac이 이미 제공되었습니다. –

+0

제 생각에는 그 모양으로 보지 못했지만, 그의 게시물은 약 30 분 후에 표시됩니다. 여분의 소수를 자르지 않는 게시물과 댓글 만 보았습니다. –

+0

@DanielGrankin 나는 대답 할 것이다. –

관련 문제