对不起,我是新手,但我找不到一个我甚至不知道怎么问的问题的答案。
假设我有一个类似这样的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>
谢谢!
答案 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?来执行此操作...可用于“捕获”匹配文本的部分并引用它们(通常通过使用匹配结果的代码) ,甚至只是在正则表达式的后面部分。)