5

スラッシュで区切られた数字を展開する方法を探しています。スラッシュに加えて、いくつかの (またはすべての) 数字の周りに括弧を使用して、(括弧の直後の回数だけ) 繰り返されるか、逆に繰り返される (「s」が続く) 「グループ」を示すことができます。例の 2 番目のセットに示されています)。いくつかの例は次のとおりです。

1          -> ['1']                          -> No slashes, no parentheses
1/2/3/4    -> ['1', '2', '3', '4']           -> basic example with slashes
1/(2)4/3   -> ['1', '2', '2', '2', '2', '3'] -> 2 gets repeated 4 times
1/(2/3)2/4 -> ['1', '2', '3', '2', '3', '4'] -> 2/3 is repeated 2 times
(1/2/3)2   -> ['1', '2', '3', '1', '2', '3'] -> Entire sequence is repeated twice
(1/2/3)s   -> ['1', '2', '3', '3', '2', '1'] -> Entire sequence is repeated in reverse
1/(2/3)s/4 -> ['1', '2', '3', '3', '2', '4'] -> 2/3 is repeated in reverse

最も一般的なケースでは、ネストされた括弧が存在する可能性さえありますが、これは通常、正規表現の使用を不可能にすることを私は知っています. 私が処理する必要がある現在のデータセットには、このような入れ子になったセットはありませんが、将来的には使用できる可能性があります。例えば:

1/(2/(3)2/4)s/5 -> 1/(2/3/3/4)s/5
                -> 1/2/3/3/4/4/3/3/2/5
                -> ['1', '2', '3', '3', '4', '4', '3', '3', '2', '5']

もちろん、正規表現がこれらすべてを実行できないことは知っています(特に、括弧の繰り返し/反転セットを使用する場合)。しかし、少なくとも括弧内の文字列を括弧内にない文字列から分離する正規表現を取得できれば、おそらくいくつかのループを非常に簡単に作成して、残りの処理を行うことができます。したがって、私が探している正規表現は次のようになります。

1               -> ['1']
1/2/3/4         -> ['1', '2', '3', '4']
1/(2)4/3        -> ['1', '(2)4', '3']
1/(2/3)2/4      -> ['1', '(2/3)2', '4']
1/(2/(3)2/4)s/5 -> ['1', '(2/(3)/2/4)s', '5']

そして、この結果をループして、数字だけになるまで括弧を拡張し続けることができます。

編集

元の投稿では完全に明確ではありませんでした。例をできるだけ単純化しようとして、単純化しすぎた可能性があります。これは、10 以上の数値と負の数値に対して機能する必要があります。

例えば:

1/(15/-23)s/4   -> ['1', '(15/-23)s', '4']
                -> ['1', '15', '-23', '-23', '15', '4']
4

3 に答える 3