Pythonでテキストの文字列を指定し、その内容をリストに分割し、3つのパラメーターで分割する方法が必要です-最も外側の括弧と最も外側の括弧と通常のテキスト、元の構文を維持します。
たとえば、与えられた文字列
(([a] b) c ) [d] (e) f
予想される出力は次のリストです。
['(([a] b) c )', '[d]', '(e)', ' f']
次のような正規表現でいくつかのことを試しました
\[.+?\]|\(.+?\)|[\w+ ?]+
私にくれた
>>> re.findall(r'\[.+?\]|\(.+?\)|[\w+ ?]+', '(([a] b) c ) [d] (e) f')
['(([a] b)', ' c ', ' ', '[d]', ' ', '(e)', ' f']
(間違ったリストの項目 c)
貪欲バージョンも試してみましたが、
\[.+\]|\(.+\)|[\w+ ?]+
しかし、文字列に同じ種類の個別の演算子がある場合は不十分です。
>>> re.findall(r'\[.+\]|\(.+\)|[\w+ ?]+', '(([a] b) c ) [d] (e) f')
['(([a] b) c ) [d] (e)', ' f']
次に、代わりにスタックを使用するように正規表現から移動しました。
>>> def parenthetic_contents(string):
stack = []
for i, c in enumerate(string):
if c == '(' or c == '[':
stack.append(i)
elif (c == ')' or c == ']'):
start = stack.pop()
yield (len(stack), string[start + 0:i+1])
フラットテキストを取得する方法がないことを除いて、ブラケットと括弧の場合、どちらがうまく機能しましたか(または、取得できますが、それについてわかりませんか?):
>>> list(parenthetic_contents('(([a] b) c ) [d] (e) f'))
[(2, '[a]'), (1, '([a] b)'), (0, '(([a] b) c )'), (0, '[d]'), (0, '(e)')]
私はpyparsingに慣れていません。最初は、nestedExpr() でうまくいくように見えましたが、1 つの区切り文字 (() または [] で、両方ではない) しか必要としないため、うまくいきません。
私は今、すべてのアイデアがありません。どんな提案でも大歓迎です。