使用以前的结果

时间:2017-04-27 22:48:49

标签: python regex

对不起,我是新手,但我找不到一个我甚至不知道怎么问的问题的答案。

假设我有一个类似这样的XML文件:

<fields>
   <field1>
       <name>Frank</name>
   </field1>
   <field2>
       <name>Bob</name>
   </field2>
   <field3>
        <name>Spam</name>
   </field3>
</fields>

我想删除name = Bob的任何地方。我可以试试

regex = re.compile("<fields>.*<field/d><name>Bob</field/d>.*</fields>"
data = regex.sub("", data"

我的delimma是删除之间的所有内容。如何指定我希望两者的/ d相同,以便我只能删除之间的内容和?实际上,我希望生成的XML看起来像

<fields>
   <field1>
       <name>Frank</name>
   </field1>
   <field3>
        <name>Spam</name>
   </field3>
</fields>

谢谢!

2 个答案:

答案 0 :(得分:0)

使用“反向引用”:

import re

text = """<fields>
   <field1>
       <name>Frank</name>
   </field1>
   <field2>
       <name>Bob</name>
   </field2>
   <field3>
        <name>Spam</name>
   </field3>
</fields>"""

pattern = re.compile(
    r'(<field(?P<n>\d)>[\s\S]+Bob[\s\S]+</field(?P=n)>)')

print(pattern.sub('', text))

# <fields>
#    <field1>
#        <name>Frank</name>
#    </field1>
#
#    <field3>
#         <name>Spam</name>
#    </field3>
# </fields>

https://docs.python.org/2/library/re.html

  

(?P = name)对命名组的反向引用;它匹配任何文本   与名为name的早期组匹配。

正如@JimDennis所提到的,使用正则表达式来解析/处理XML数据真是个坏主意。请改用XML解析器!

答案 1 :(得分:0)

请不要使用正则表达式来解析XML,HTML或其他基于SGML的文本。在最低级别,大多数解析器使用正则表达式;但解析这些的过程充满了陷阱,如果您使用已经编写(和调试)的库来执行此操作,您的代码将更加健壮。

我建议您在StackOverflow上阅读:$.ajax(),了解更多详情。

在回答您的具体问题时,您可以使用How do I parse XML in Python?来执行此操作...可用于“捕获”匹配文本的部分并引用它们(通常通过使用匹配结果的代码) ,甚至只是在正则表达式的后面部分。)