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

时间:2017-09-21 11:19:49

标签: python regex

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

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

我想将GalactusId值替换为“Galactus id”,即来自现有GalactusId的HULK或ironman + First 3字符 和GalactusName一样。所以看起来很像。

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

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

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

1 个答案:

答案 0 :(得分:1)

使用正则表达式解析XML或HTML是一种bad做法。您应该使用XML Parser。对于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())