我有一个带有嵌入式标签的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')


如果一起''.joinsubr'\1\2'等,则将获得所需的输出。

第四,这当然是非常脆弱的。但是,使用regexp解析XML之类的非常规语言肯定会非常脆弱(或者非常复杂,有时甚至呈指数级地缓慢),这就是为什么您不应该这样做。但这就是您要的。

而且,如果您尝试将其与a function that doesn't take regexp patternsone that takes a different regexp syntax than Python's一起使用,这可能对您没有太大帮助。

关于python - 忽略正则表达式中文件中间的xml标记(带有非捕获组?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19444413/

10-12 20:21