Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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
使用前一个结果搜索Python正则表达式_Python_Regex - Fatal编程技术网

使用前一个结果搜索Python正则表达式

使用前一个结果搜索Python正则表达式,python,regex,Python,Regex,很抱歉,我是新手,但我找不到一个答案来回答一个我甚至不知道如何提问的问题 假设我有一个XML文件,它有如下内容: <fields> <field1> <name>Frank</name> </field1> <field2> <name>Bob</name> </field2> <field3> <

很抱歉,我是新手,但我找不到一个答案来回答一个我甚至不知道如何提问的问题

假设我有一个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"
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>