我有一个非常长的字符串,其中包含以十进制度表示的多个地理坐标(例如:+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 ]…’
答案 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的评论中,我在答案发布之前不久就看到了。