2

重複の可能性:
Python でネストされた構造を正規表現と照合する

この問題に頭を悩ませることはできません。次のような文字列があります。

Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet

私の仕事は、コマンド (常に[@で始まり、]で終わる) とそのサブコマンドを抽出することです。みたいな結果

[
    [@a xxx yyy [@b xxx yyy [@c xxx yyy]]], # the most outer
    [@b xxx yyy [@c xxx yyy]],              # the middle one
    [@c xxx yyy]                            # the inner most
]

高く評価されます。問題は、これらの種類のコマンドが非常に長いテキスト メッセージで発生する可能性があることです。そのため、「パフォーマンスの高い」ソリューションが適しています。

私はほとんどの場合、いくつかの正規表現パターンをいじっていました

(\[@.*?\]\s) # for the outer one

しかし、私は真ん中と内側のものに一致する光を見たことがありません. さらに複雑にするために、ネストされたコマンドの量は可変です...特別な正規表現が解決策になるのでしょうか? 先読みと後読みについて読みましたが、この特別なケースでそれらを使用する方法がわかりません。

たくさんありがとう!

アップデート

@ Cyborgx37 は、pyparsing パッケージを使用する別の投稿を教えてくれました。外部パッケージやライブラリを使用しないソリューションがあればいいのにと思います。しかし、パイパーシングは間違いなくその問題を解決します!

4

3 に答える 3

2

C# には再帰的/ネストされた RegEx がありますが、Python にはないと思います。以前の結果に対して RegEx 検索を再実行することもできますが、これはおそらくカスタム パーサーを作成するよりも効率的ではありません (このような単純な検索に対する RegEx のオーバーヘッド)。「[@」と「]」を検索するテキストはそれほど複雑ではありません。

これは、ジョブを実行するカスタム パーサー (JavaScript) です。

var txt = "Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet";
function parse(s) {
    var stack = [];
    var result = [];
    for(var x=0; x<s.length; x++) {
        var c = s.charAt(x);
        if(c == '[' && x+1 < s.length-1 && s.charAt(x+1) == '@') {
            for(var y=0; y<stack.length; y++)
                stack[y] += "[@";
            stack.push("[@");
            x++;
        } else if(c == ']' && stack.length > 0) {
            for(var y=0; y<stack.length; y++)
                stack[y] += "]";
            result.push(stack.pop());
        } else {
            for(var y=0; y<stack.length; y++)
                stack[y] += c;
        }
    }
    return result;
}
parse(txt);

テキストのすべての文字をすばやく (1 回だけ) ループし、スタックと if...if else...else 条件を使用して、そのスタック内の値をそれぞれプッシュ、ポップ、および変更します。

于 2013-02-05T16:45:15.823 に答える
0

ac# バックグラウンドから来ているので、これが役立つかどうかはわかりません、とにかく内部コマンドを解析する必要があるため、コマンドの内容を保存してから、正規表現関数を再度実行しないでください。内部データ?おそらく何かが欠けていることはわかっていますが、だからこそ、少なくとも試してみます。

于 2013-02-05T16:25:49.160 に答える
0

問題に頭を悩ませられないのも不思議ではありません。形式言語については形式言語論というものがあります。ノーム・チョムスキーは、チョムスキー階層として知られる言語の 4 つのカテゴリについて説明しました。正規表現は、言語の簡単なカテゴリ (正規言語) を記述することができます。ただし、入れ子になったペア構造を持つ言語は正規言語の範囲外であり、正規表現で記述/受け入れることはできません。

最も簡単に実装できるパーサーの 1 つは、言語の要素を解析する関数の再帰呼び出しに基づくパーサーです。

于 2013-02-05T17:03:34.317 に答える