みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

ネストされた括弧と正規表現

ネストされた括弧を扱おうと正規表現を調べましたが,Pythonの標準のreには,(?R)など再帰が扱えないことが分かり,代わりにregexを使えばよさそう*1ということは分かりましたが,わざわざ正規表現を使わなくてもよいのではと思い,シンプルに書いてみました.

例えば,一番外側の括弧だけを外す関数を実装しました.

def get_bracket_content(self, n):
    depth = 0
    f = 0
    for i, c in enumerate(n):
        if c == "(":
            depth += 1
            if depth == 1:
                f = i+1
        elif c == ")":
            depth -= 1
            if depth == 0:
                yield n[f:i]

動作を確認します.

get_bracket_content("(1)(2)(3)")
>>> ['1', '2', '3']
get_bracket_content("aaa(bb)!(cc(d))")
>>> ['bb', 'cc(d)']
get_bracket_content("(()()())")
>>> ['()()()']

depthに括弧の深さを記録し,depthに応じた処理をするようにするのが簡単だと思いました.