1

タグが埋め込まれた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>
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または\n0 回以上

Online demo

于 2013-10-18T09:52:29.910 に答える
1

あなたの表現には少なくとも 4 つの問題があります。

<xml>まず、 からまでのすべてを</xml>1 つの大きなグループにまとめます。これは、FType ビットを除外しても何も得られないことを意味します。そうしないと、すべてを取得できます。3 つの個別のグループを作成し、中央のグループを非キャプチャにすると、中央のグループを除外できます。

<FType>次に、 からまでのすべてを除外しようとしていますが、<FType>うまくいきません。終了タグは</FType>.

第 3 に、どこでも貪欲な一致を使用しているため、最初の 2 つが正しくても、以前の 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'などにすると、目的の出力が得られます。

第四に、もちろん、これは恐ろしくもろい。しかし、正規表現を使用した XML のような非正規言語の解析は、非常に脆い (または非常に複雑で、場合によっては指数関数的に遅くなる) ことが保証されているため、実行すべきではありません。しかし、それはあなたが求めたものです。

また、正規表現パターンを取らない関数、またはPython の とは異なる正規表現構文を取る関数でこれを使用しようとしている場合、これはおそらくあまり役​​に立ちません。

于 2013-10-18T08:54:50.397 に答える
1

を使用する 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 に答える