我有一个带有嵌入式标签的xml,我想捕获除FType标签外的所有内容...
在python正则表达式中。
<xml>
<EType>
<E></E>
<F></F>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<G></G>
</EType>
</xml>
我试过了 :
(?P<xml>.*(?=<FType>.*<FType>).*)
但这给了我一切;-(
我预计 :
<xml>
<EType>
<E></E>
<F></F>
<G></G>
</EType>
</xml>
最佳答案
您的表情至少有四个问题。
首先,您要捕获一个大组中从<xml>
到</xml>
的所有内容。这意味着,如果您设法排除FType位,那么您将一无所获。如果不这样做,您将得到一切。如果创建三个单独的组,并使中间一组不被捕获,则可以排除中间一组。
其次,您要尝试排除从<FType>
到<FType>
的所有内容,这是行不通的。结束标记为</FType>
。
第三,您到处都在使用贪婪匹配,因此,即使您正确地使用了前两个,也要匹配到最后一个FType的所有内容,包括任何较早的FType。
放在一起:
>>> re.match(r'(?P<xml>.*?)(?:<FType>.*</FType>)(.*)', s, re.DOTALL).groups()
('<xml>\n<EType>\n<E></E>\n<F></F>\n', '\n<G></G>\n</EType>\n</xml>\n')
如果一起
''.join
或sub
到r'\1\2'
等,则将获得所需的输出。第四,这当然是非常脆弱的。但是,使用regexp解析XML之类的非常规语言肯定会非常脆弱(或者非常复杂,有时甚至呈指数级地缓慢),这就是为什么您不应该这样做。但这就是您要的。
而且,如果您尝试将其与a function that doesn't take regexp patterns或one that takes a different regexp syntax than Python's一起使用,这可能对您没有太大帮助。
关于python - 忽略正则表达式中文件中间的xml标记(带有非捕获组?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19444413/