質問: 文字列を句点(。)ごとに区切りたいです。 ただ、鍵括弧(「」、『』)で括られた中の句点にはマッチしてほしくないです。 どのような正規表現であれば、上記のようなことができるのかわかりません。 正しい正規表現を教えてください。よろしくお願いします。 サンプルは以下のとおりです。 ``` 分割前 あ。「いい。」いい。ううう「ううう。」ううう。ええええ。「ええええ。」ええええ。おおおおお「おおおおお」おおおおお。「かか。かかか。」かかか。「「きき。」ききき。」きき。 くく「くく『くく。』くく。」くく。けけ「けけ『けけ』けけ」けけ。ここ「ここ『ここ。ここ』」ここ。『ささ。ささ。』ささ。 ``` ``` 分割後 あ。 「いい。」いい。 ううう「ううう。」ううう。 ええええ。 「ええええ。」ええええ。 おおおおお「おおおおお」おおおおお。 「かか。かかか。」かかか。 「「きき。」ききき。」きき。 くく「くく『くく。』くく。」くく。 けけ「けけ『けけ』けけ」けけ。 ここ「ここ『ここ。ここ』」ここ。 『ささ。ささ。』ささ。 ```
回答: 正規表現で回答しましたが、例がカッコのネストがあるなど想定外だったので撤回します。 これは正規表現ではできません。構文解析の出番です。 追記 == 例文は正しく分割できます。 ``` import re input = 'あ。「いい。」いい。ううう「ううう。」ううう。ええええ。「ええええ。」ええええ。おおおおお「おおおおお」おおおおお。「かか。かかか。」かかか。「「きき。」ききき。」きき。' input2 = 'くく「くく『くく。』くく。」くく。けけ「けけ『けけ』けけ」けけ。ここ「ここ『ここ。ここ』」ここ。『ささ。ささ。』ささ。' def splitByPeriod(s): start = 0 braceCount = 0 for i in range(len(s)): if s[i] == '「' or s[i] == '『': braceCount += 1 elif s[i] == '」' or s[i] == '』': braceCount -= 1 elif s[i] == '。' and braceCount <= 0: yield s[start:i + 1] start = i + 1 for phrase in splitByPeriod(input): print(phrase) for phrase in splitByPeriod(input2): print(phrase) ```