【问题标题】:How to remove XML tags using regular expression in python?如何在 python 中使用正则表达式删除 XML 标签?
【发布时间】:2018-09-13 18:42:29
【问题描述】:

python 中的字符串可以包含某些纯文本以及包含某些信息的少数 XML 标记。例如:

The student XYZ abc has been terminated from the institute. 
you can find the details of student below:
<info StatusCode="End">
    <user_detail>
        <name>
            <first_name>ABC</first_name>
            <last_name>XYZ</last_name>
        </name>
        <contact_details>
            <contact_number>
                <number_type>landline</number_type>
                <number>1234567</number>
            </contact_number>
            <address>
                <address_field1> lorem ipsum, qwerty </address_field1>
                <address_field2> lorem ipsum2, qwerty2 </address_field2>
                <city> asdfgh </city>
                <state> zxcvbn </state>
                <country> India </country>
            </address>
        </contact_details>
    </user_detail>
    <flight_detail>
        ...
    </flight_detail>
</info>
Lorem ipsum dolor sit amet, pro ea dicat velit regione, modo putant 
sensibus pri id, ut bonorum scripserit sit. Ex nec tation alienum, est ut 
nemore efficiendi interpretaris, vis te reque eleifend. 
<xml_tag>
...
</xml_tag>
Laudem delectus
reprehendunt ei mei, has nisl dolorem mnesarchum no, ad eos modo singulis
euripidis. Quo no consul offendit. Eu alia utroque argumentum vix, no 
case primis eum.
<xml_tag>
....
</xml_tag>

XML 的开始标签不固定为&lt;info&gt;,它可以是&lt;session StatusCode="End"&gt; 之类的任何东西,在这种情况下,结束标签将为&lt;/session&gt;。 目前,我正在使用

删除这个 xml 标签
data = re.sub(r'<[^<]+>', "", data)

但是,现在我想从这个文本中删除所有 XML 内容。我现在想要的最终输出是:

The student XYZ abc has been terminated from the institute. 
you can find the details of student below:
Lorem ipsum dolor sit amet, pro ea dicat velit regione, modo putant 
sensibus pri id, ut bonorum scripserit sit. Ex nec tation alienum, est ut 
nemore efficiendi interpretaris, vis te reque eleifend. 
Laudem delectus
reprehendunt ei mei, has nisl dolorem mnesarchum no, ad eos modo singulis
euripidis. Quo no consul offendit. Eu alia utroque argumentum vix, no 
case primis eum. 

我尝试使用&lt;/\S+&gt; 进行匹配,但它会删除直到第一个关闭 XML 标记。如何从也可以包含简单文本的纯文本字符串中删除所有 XML 内容。

【问题讨论】:

  • 我有一个类似的问题here 帮助了我。
  • “但是,”实际上并没有说明问题或您得到的结果。您的代码到底不做什么?请参阅minimal reproducible example

标签: python regex xml


【解决方案1】:

&lt;(.*?&gt;)(.*)&lt;/\1 带有单行选项,匹配您要删除的 XML。 innerxml 在第二组中

https://regex101.com/r/HwiA2t/1

【讨论】:

  • 如何在 python 中将正则表达式配置为单行选项?不是默认设置为单行选项吗?
  • 使用 DOTALL 或 s 修饰符rexegg.com/regex-modifiers.html#dotall 例如re.compile(r'_(regex)_', re.DOTALL)
  • 如果它们是标签中列出的某些属性,则不起作用,例如:regex101.com/r/HwiA2t/2
  • 为了适应属性,使用&lt;(?:(.*?)\s.+?&gt;)(.*?)&lt;/\1[&gt;]?regex101.com/r/HwiA2t/3
  • regex101.com/r/HwiA2t/3 在你给出的这个例子中,XML标签中的数据也在最后一部分被删除了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2015-06-18
  • 2010-10-21
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多