あなたの表現には少なくとも 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 の とは異なる正規表現構文を取る関数でこれを使用しようとしている場合、これはおそらくあまり役に立ちません。