1

我有一个带有嵌入标签的 xml,我想在 python 正则表达式中捕获除 FType 标签之外的所有内容。

<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>
4

4 回答 4

2

不需要正则表达式:

In [1]: x = '''    
<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>'''

In [2]: y = '\n'.join([tag for tag in x.split() if not tag.startswith('<FType>')])

In [3]: print y
<xml>
<EType>
<E></E>
<F></F>
<G></G>
</EType>
</xml>
于 2013-10-18T08:50:23.313 回答
1

在阅读了您更新的问题和所有其他答案后,我想why do you even match ?
您可以<FType>...</FType>使用替换功能删除。

import re

string = "<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>"

result = re.sub(r'(?i)<ftype>.*?</ftype>[\r\n]*', r'', string)

print result.replace("<", "&lt;").replace(">", "&gt;<br>") # the replace function is just for the output

解释:

  • (?i): 使i修饰符匹配不区分大小写
  • <ftype>: 匹配<ftype>
  • .*?:匹配一切不贪婪,直到...
  • </ftype>: 匹配</ftype>
  • [\r\n]*: 匹配\r\n零次或多次

Online demo

于 2013-10-18T09:52:29.910 回答
1

一种使用的方法:

from bs4 import BeautifulSoup

soup = BeautifulSoup(open('xmlfile', 'r'), 'xml')
for elem in soup.find_all('FType'):
    elem.decompose()

print(soup.prettify())

它产生:

<?xml version="1.0" encoding="utf-8"?>
<xml>
 <EType>
  <E/>
  <F/>
  <G/>
 </EType>
</xml>
于 2013-10-18T08:54:29.447 回答
1

你的表达至少有四个问题。

首先,您要在一个大组中捕获从<xml>到的所有内容。</xml>这意味着如果您设法排除 FType 位,您将一无所获;如果你不这样做,你会得到一切。如果您创建三个单独的组,并使中间的一组不被捕获,那将使您排除中间的一组。

其次,您试图排除 to 中的所有内容<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一起,或者subr'\1\2',等等,你会得到想要的输出。

第四,这当然是非常脆弱的。但是用正则表达式解析像 XML 这样的非常规语言肯定会非常脆弱(或者非常复杂,有时会呈指数级缓慢),这就是为什么你不应该这样做。但这就是你要求的。

如果您尝试将它与不采用正则表达式模式的函数一起使用,或者采用与 Python 不同的正则表达式语法的函数,那么这可能对您没有太大帮助。

于 2013-10-18T08:54:50.397 回答