我有一个这样的点坐标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>
有什么想法吗?
答案 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中对表达式进行说明。