Python 正規表現の再帰について


Pythonの正規表現についてです。

[code]

    int abc( int a ){
        if( a > 0 ){
            return 1;
        }else{
            return 0;
        }
    }
    int xyz()
        { return aPtr->type; }
    
[/code]

上のようなテキストを以下のように置換しようとしています。

[code]

    int abc( int a );
    int xyz();
    
[/code]

そこで次のようなコードを書きました。

[code]

    pattern = r'(\)\s*\{\s*(?:.+(?R))*.*\s*\})'
    content = regex.sub( pattern, r');', content )
    
[/code]

ところが意図したとおりに置換せず、結果は以下のようになります。

[code]

    int abc( int a ){
        if( a > 0 );else{
            return 0;
        }
    }
    int xyz();
    
[/code]

(?:...) は ... にマッチしても終了しないということだと理解しているのですが、外側の ){ } にマッチしないのはどうしてでしょうか？

いろいろパターンを変えてやっていますが、基本的なところが理解できていないため、意図したとおりの結果になりません…




結論から先に言いますと，質問者様はほとんど正解に近いところに至っていて，次のパターンを使えば目的の結果を得られると思います．

[code]

    pattern = r'\)*\s*\{\s*(?:.+(?R))*.*\s*\}'
    
[/code]

変更点は最初の `\)` を「0個以上」に対してマッチするようにしただけです．

`\R` は pattern 全体を指すので，(?:...) の部分の非終了条件は「`)` から始まるバランスのとれた `{}`
で囲まれた文字列」です．入力テキスト中 `else{...}` の部分は「`)` から **始まらない** バランスのとれた `{}`
で囲まれた文字列」になってしまっているので，ここでマッチが終了して失敗するのだと思います．

