示例:
这有预期的效果:
将以下内容替换为空白:
<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
和所有内容替换为空白?
答案 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>