正则表达式,用于使用父标记的id替换子标记中的值文本

2024-06-26 10:19:08 发布

您现在位置:Python中文网/ 问答频道 /正文

<Galactus id="ironman">
    <GalactusId>METALIC</GalactusId>
    <GalactusName>COMMUNICATOR</GalactusName>
</Galactus>

<Galactus id="HULK">
    <GalactusId>BULKY</GalactusId>
    <GalactusName>CRUSHER</GalactusName>
</Galactus>

我想将GalactusId值替换为“Galactus id”,即绿巨人或铁人+现有GalactusId中的第一个3字符 GalaxusName也是一样。所以外面应该是这样的

<Galactus id="ironman">
    <GalactusId>ironman_MET</GalactusId>
    <GalactusName>ironman_COM</GalactusName>
</Galactus>

<Galactus id="HULK">
    <GalactusId>HULK_BUL</GalactusId>
    <GalactusName>HULK_CRU</GalactusName>
</Galactus>

所有子标签都应该相应地更改,而不仅仅是这两个


Tags: comid字符methulkcommunicatorironmanbulky
1条回答
网友
1楼 · 发布于 2024-06-26 10:19:08

用regex解析XML或HTML是一种bad实践。您应该使用XML解析器。对于Python,lxml可能是最流行的

import lxml.etree
xml = lxml.etree.fromstring('''
<xml>
    <Galactus id="ironman">
        <GalactusId>METALIC</GalactusId>
        <GalactusName>COMMUNICATOR</GalactusName>
    </Galactus>

    <Galactus id="HULK">
        <GalactusId>BULKY</GalactusId>
        <GalactusName>CRUSHER</GalactusName>
    </Galactus>
</xml>''')

for galactus in xml.iterfind('.//Galactus'):
    for child in galactus.getchildren():
        child.text = galactus.attrib['id'] + '_' + child.text[:3]

print(lxml.etree.tostring(xml).decode())

相关问题 更多 >