Python按比例缩小xml文件中的数字

时间:2019-06-27 17:05:17

标签: python regex xml

我有一个这样的点坐标xml文件

<vertex x="15" y="15.2"/>

我想像这样缩放这些坐标

<vertex x="15*factor" y="15.2*factor"/>

带有factor=0.2(一个数字)

我当时正在考虑使用re。像这样:

 re.sub(r'(x=\"[0-9]\"', X, X*factor, data)

我宁愿不要在所有行上使用两个循环,而split最好不要这样一个循环。

因为我将文件读取为一个字符串

f = open(filename)
data = f.read()
f.close()

编辑:

更多上下文

<polygon>
    <vertex x="-15" y="15"/>
    <vertex x="-15" y="-15"/>
</polygon>
<polygon>
    <vertex x="15" y="-15"/>
    <vertex x="15" y="15"/>
</polygon>
<polygon>
    <vertex x="-15" y="-15"/>
    <vertex x="15" y="-15"/>
</polygon>

factor = 0.1的输出

<polygon>
    <vertex x="-1.5" y="1.5"/>
    <vertex x="-1.5" y="-1.5"/>
</polygon>
<polygon>
    <vertex x="1.5" y="-1.5"/>
    <vertex x="1.5" y="1.5"/>
</polygon>
<polygon>
    <vertex x="-1.5" y="-1.5"/>
    <vertex x="1.5" y="-1.5"/>
</polygon>

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这里

import xml.etree.ElementTree as ET


xml = '''<r><polygon>
    <vertex x="-15" y="15"/>
    <vertex x="-15" y="-15"/>
</polygon>
<polygon>
    <vertex x="15" y="-15"/>
    <vertex x="15" y="15"/>
</polygon>
<polygon>
    <vertex x="-15" y="-15"/>
    <vertex x="15" y="-15"/>
</polygon></r>'''


def scale(factor):
    root = ET.fromstring(xml)
    vertex_lst = root.findall('.//vertex')
    for vertex in vertex_lst:
        for attr in ['x','y']:
            vertex.attrib[attr] = str(int(vertex.attrib[attr]) * factor)
    ET.dump(root)


scale(0.1)

输出

<r><polygon>
    <vertex x="-1.5" y="1.5" />
    <vertex x="-1.5" y="-1.5" />
</polygon>
<polygon>
    <vertex x="1.5" y="-1.5" />
    <vertex x="1.5" y="1.5" />
</polygon>
<polygon>
    <vertex x="-1.5" y="-1.5" />
    <vertex x="1.5" y="-1.5" />
</polygon></r>

答案 1 :(得分:0)

我不太确定这里可能需要什么输出,我想也许我们将从类似以下的表达式开始:

(x=|y=)\"\s*([-]?[0-9]+)\s*\"

测试

import re

regex = r"(x=|y=)\"\s*([-]?[0-9]+)\s*\""

test_str = ("<polygon>\n"
    "    <vertex x=\"-15\" y=\"15\"/>\n"
    "    <vertex x=\"-15\" y=\"-15\"/>\n"
    "</polygon>\n"
    "<polygon>\n"
    "    <vertex x=\"15\" y=\"-15\"/>\n"
    "    <vertex x=\"15\" y=\"15\"/>\n"
    "</polygon>\n"
    "<polygon>\n"
    "    <vertex x=\"-15\" y=\"-15\"/>\n"
    "    <vertex x=\"15\" y=\"-15\"/>\n"
    "</polygon>")

subst = "\\1\"\\2\\*factor\""

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

如果您感兴趣,请在此demo中对表达式进行说明。