使用前一个结果搜索Python正则表达式
很抱歉,我是新手,但我找不到一个答案来回答一个我甚至不知道如何提问的问题 假设我有一个XML文件,它有如下内容:使用前一个结果搜索Python正则表达式,python,regex,Python,Regex,很抱歉,我是新手,但我找不到一个答案来回答一个我甚至不知道如何提问的问题 假设我有一个XML文件,它有如下内容: <fields> <field1> <name>Frank</name> </field1> <field2> <name>Bob</name> </field2> <field3> <
<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"
regex=re.compile(“%Bob.*”)
data=regex.sub(“,data”
我的定义是,介于和之间的所有内容都在删除。我如何指定我希望两者的/d相同,以便我只能删除介于和之间的内容?实际上,我希望生成的XML是这样的
<fields>
<field1>
<name>Frank</name>
</field1>
<field3>
<name>Spam</name>
</field3>
</fields>
直率的
垃圾邮件
谢谢!使用“反向参考”:
重新导入
text=”“”
直率的
上下快速移动
垃圾邮件
"""
模式=重新编译(
r'([\s\s]+Bob[\s\s]+))
打印(pattern.sub(“”,text))
#
#
#坦率的
#
#
#
#垃圾邮件
#
#
:
(?p=name)对命名组的反向引用;它匹配任何文本
由名为name的早期组匹配
正如@JimDennis所提到的,使用正则表达式来解析/处理XML数据确实是个坏主意。请改用XML解析器!请不要使用正则表达式来解析XML、HTML或其他基于SGML的文本。在最底层,大多数解析器都使用正则表达式;但解析这些数据的过程充满了陷阱和漏洞如果您使用已经编写(和调试)的库来执行此操作,那么您的代码将更加健壮 我建议阅读:关于StackOverflow的更多细节
在回答您的特定问题时,您可以使用…来实现这一点,它可以用于“捕获”匹配文本的部分并引用它们(通常通过使用匹配结果的代码,但也可以仅在正则表达式的后面部分中).谢谢Philip。非常有魅力!谢谢你的回复Jim!我明白为什么正则表达式不是最好的选择,但是因为我正在使用其他人的代码,只是修复了不起作用的代码,所以反向引用是更快的解决方案。非常感谢!
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>