63

これは、外側の括弧に一致する正規表現に非常に関連していますが、この正規表現の再帰パターンを実行する方法または可能性があるかどうかを具体的に知りたいですか? この戦略を使用した python の例をまだ見つけていないので、これは役に立つ質問だと思います!

再帰パターンを使用してバランスの取れた括弧を一致させることができるという主張 きましたが、python の正規表現パッケージを使用した例はありません(注: reは再帰パターンをサポートしていないため、正規表現を使用する必要があります)。

1つの主張は、構文がb(?:m|(?R))*eどこにあるということです:

bは構成の始まり、 は構成mの途中で発生する可能性があるeもの、 は構成の最後で発生する可能性があるものです。


次の外括弧の一致を抽出したい:

"{1, {2, 3}} {4, 5}"
["1, {2, 3}", "4, 5"]  # desired

内側のブレースについても同じことが簡単にできることに注意してください。

re.findall(r"{([^{}]*)}", "{1, {2, 3}} {4, 5}")
['2, 3', '4, 5']

(私の例では、finditer (マッチ オブジェクトに対して) を使用していました。こちらを参照してください。)

したがって、次の、またはいくつかのバリエーションが機能することを期待していました。

regex.findall(r"{(:[^{}]*|?R)}", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:[^{}]*|?R)})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:.*|(?R))*})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:.*)|(?R)*})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:[^{}])|(?R)})", "{1, {2, 3}} {4, 5}")

しかし、私は [] またはerror: too much backtracking.

正規表現の再帰を使用して、外括弧の一致オブジェクトを抽出することは可能ですか?


明らかに、私は撃墜される危険があります:

これは、再帰パターンの使用方法に関するものであることを強調したいと思います(私の理解が正しければ、通常の言語解析の範囲外になるため、実際に可能になる可能性があります!)。それができれば、これはよりクリーンなソリューションになるはずです。

4

2 に答える 2

10

b(?:m|(?R))*e私はこれを構文で問題なく行うことができました:

{((?:[^{}]|(?R))*)}

デモ


あなたが試みていたことの鍵は、繰り返しが続くのではなく、グループm全体であるということだと思います. (?:m|(?R))これにより、(?R)参照による再帰が可能になります。

于 2014-10-15T15:17:38.470 に答える