Python re.sub中的<tag 1>中的<tag 2>需要特殊处理吗?</tag1> </tag2>

时间:2013-10-07 04:46:32

标签: regex python-2.7 xml-parsing

示例:

这有预期的效果:

将以下内容替换为空白:

<tag condition="MyCondition">Text</tag>

经:

string = re.sub('<tag condition=\"MyCondition\">.+</tag>', '', string)

但请考虑以下因素:

<tag2 condition="myCondition2">
<tag>Text</tag> and <tag>text</tag> is here.
</tag2>

我想用空白替换tag2和所有内容,例如:

string = re.sub('<tag2 condition=\"myCondition2\">.+</tag2>', '', string)

它不会删除tag2和内容,我认为可能是因为<tags>中有tag2

如何将tag2和所有内容替换为空白?

2 个答案:

答案 0 :(得分:1)

一旦你通过简单的案例,正则表达式成为你的敌人。只需使用适当的XML解析器解析XML,修改已解析的树,然后将其打印出来:

import lxml.etree

xml = '''
    <?xml version="1.0" encoding="UTF-8" ?>
    <root>
        <tag condition="MyCondition">Text</tag>

        <tag3>Don't touch me</tag3>

        <tag2 condition="myCondition2">
            <tag>Text</tag> and <tag>text</tag> is here.
        </tag2>
    </root>
'''

tree = lxml.etree.fromstring(xml.strip())

for element in tree.xpath('//tag[@condition="MyCondition"] | //tag2[@condition="myCondition2"]'):
    element.getparent().remove(element)

print(lxml.etree.tostring(tree, pretty_print=True))

答案 1 :(得分:-1)

您错过了re.DOTALL标志。没有它,你的正则表达式无法匹配换行符。 tag2会没问题,因为当你尝试将表达式应用于(几乎)等效时,你可以看到

<tag2 condition="myCondition2"><tag>Text</tag> and <tag>text</tag> is here.</tag2>