pythonで括弧の入れ子を検出
文字列の処理で括弧が入れ子になっていた場合に一番外側の括弧だけ検出するにはどうすればいいでしょうか。
あいう「えお「か「き」く「け」こ」さし」すせそたち「つて」と
例えば上のような文字列から
「えお「か「き」く「け」こ」さし」
「つて」
の2箇所だけ抽出して前後に改行コードを追加したいのです。
text = "あいう「えお「か「き」く「け」こ」さし」すせそたち「つて」と"
regex = re.compile(r'(「([^「」]*「[^「」]*」[^「」]*)*[^「」]*」)')
text = re.sub(regex, r'\n\1\n', text)
上記のコードだと「か「き」く「け」こ」の前後、 「つて」の前後に改行コードが入ります。
2重の入れ子までなら対応できるのですが、3重、4重と入れ子が何重まであるか不明な場合でも対応できるようにしたいです。
python 3.5.1を使っています。
皆様の回答を受けまして、以下のような関数にまとめました。
「」だったり引用符だったりで囲われた部分を抜き出せるようになりました。
# 括弧の前後に改行を挿入(括弧が入れ子の場合は一番外側の括弧に対して適用)
def add_separator_before_and_after_brackets(text, width=10, separator_pre='\n', separator_post='\n'):
import regex # 拡張正規表現のregexモジュール、標準モジュールのreとは別物なので注意
# 括弧部分の長さがwidth以上だったら前後に改行を挿入
def add_separator(match_obj):
match_text = match_obj.group()
if len(match_text) >= width:
return '{}{}{}'.format(separator_pre, match_text, separator_post)
else:
return match_text
rexp1 = regex.compile(r'(「(?>[^「」]+|(?R))*」)')
rexp2 = regex.compile(r'(『(?>[^『』]+|(?R))*』)')
rexp3 = regex.compile(r'(【(?>[^【】]+|(?R))*】)')
rexp4 = regex.compile(r'(\((?>[^\(\)]+|(?R))*\))')
rexp5 = regex.compile(r'(\[(?>[^\[\]]+|(?R))*\])')
rexp6 = regex.compile(r'(“(?>[^“”]+|(?R))*”)')
for rexp in [rexp1, rexp2, rexp3, rexp4, rexp5, rexp6]:
text = rexp.sub(add_separator, text)
return text