Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex <;是否需要特殊处理;tag2>;在<;tag1>;在Python中';s re.sub?_Regex_Python 2.7_Xml Parsing - Fatal编程技术网

Regex <;是否需要特殊处理;tag2>;在<;tag1>;在Python中';s re.sub?

Regex <;是否需要特殊处理;tag2>;在<;tag1>;在Python中';s re.sub?,regex,python-2.7,xml-parsing,Regex,Python 2.7,Xml Parsing,例如: 这具有预期的效果: 将以下内容替换为空白: <tag condition="MyCondition">Text</tag> 它没有删除tag2和内容,我认为这可能是因为tag2中存在 如何将tag2和所有内容替换为空白?您缺少re.DOTALL标志。如果没有它,正则表达式将无法匹配换行符tag2就可以了,正如您在尝试将表达式应用于(几乎)等价项时所看到的那样 <tag2 condition="myCondition2"><tag>Text

例如:

这具有预期的效果:

将以下内容替换为空白:

<tag condition="MyCondition">Text</tag>
它没有删除
tag2
和内容,我认为这可能是因为
tag2
中存在


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

您缺少
re.DOTALL
标志。如果没有它,正则表达式将无法匹配换行符
tag2
就可以了,正如您在尝试将表达式应用于(几乎)等价项时所看到的那样

<tag2 condition="myCondition2"><tag>Text</tag> and <tag>text</tag> is here.</tag2>
文本和文本在这里。

一旦你通过了简单的案例,正则表达式就成了你的敌人。只需使用适当的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))
导入lxml.etree
xml=“”
正文
别碰我
文本和文本在这里。
'''
tree=lxml.etree.fromstring(xml.strip())
对于tree.xpath('//tag[@condition=“MyCondition”]|//tag2[@condition=“myCondition2”]')中的元素:
element.getparent().remove(元素)
打印(lxml.etree.tostring(tree,pretty\u print=True))

这对多个tag2不起作用。它也不适用于自封标签!总之,您不使用正则表达式来解析html/xml@Anirudh字体哦,我完全同意。答案是解释为什么在这种特殊情况下不起作用。OP是“意识到臭名昭著的帖子”。我意识到关于不使用正则表达式解析html的臭名昭著的帖子(并使用Beautiful Soup进行更复杂的解析),但我认为对于这些简单的,
“查找所有内容并替换为空白”
类型的操作,可以使用正则表达式吗?对于一个标记,它可以工作。对于一个包含大量内容但不包含结束标记的标记,请确定。对于任何更复杂的事情,都不要尝试。
string = re.sub('<tag2 condition=\"myCondition2\">.+</tag2>', '', string)
<tag2 condition="myCondition2"><tag>Text</tag> and <tag>text</tag> is here.</tag2>
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))