查找并减少字符串中包含的十进制数

时间:2014-01-13 10:19:55

标签: python regex string

我有一个非常长的字符串,其中包含以十进制度表示的多个地理坐标(例如:+12.324333333-34.245322222)。我需要用Python修改整个字符串,以减少小数点后的数字。

首先需要找到这些坐标然后更改。

哪种方式最快最简单?

修改

这是我需要做的一个例子。

原始字符串:

‘… { "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 ]…’

4 个答案:

答案 0 :(得分:1)

试试这个

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

如果您不想更改初始字符串副本,请使用replace。你的例子的countDecimals是2.

<强>更新

来自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 :(得分: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]]}'

答案 2 :(得分:0)

这是匹配坐标的正则表达式:

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

答案 3 :(得分:0)

如何,截断为两位小数

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

随后向我指出,这个解决方案也发布在@stranac的评论中,我在答案发布之前不久就看到了。