import re


def normalize_punc(text):
    """句読点を正規化する

    正規化は次を行う
    - 「。」の代替となる文字は「。」に変換
    - 文末の「。」は削除する
    - 連続する「、」を一つにする
    - 連続する「。、」を「。」に置き換える
    - 連続する「？」を含む句読点を「？」に置き換える
    """
    text_ = text

    # 「。」の代替となる文字は「。」に変換する
    # ただし、文末の「。」は削除する
    special_chars = r"[！。…．・／]"
    special_chars_regex = re.compile(r'{}{}+'.format(special_chars,
                                                     special_chars))
    while special_chars_regex.search(text_):
        text_ = special_chars_regex.sub("。", text_)
    text_ = re.sub(special_chars, "。", text_)
    text_ = re.sub(r'{}$'.format(special_chars), "", text_)

    # 連続する伸ばし表現を一つにする
    text_ = re.sub(r'ー+', 'ー', text_)  # 全角ひらがな
    text_ = re.sub(r'－+', '－', text_)  # 全角カタカナ
    text_ = re.sub(r'〜+', '〜', text_)  # 全角ひらがな
    text_ = re.sub(r'～+', '～', text_)  # 全角カタカナ

    # 連続する「、」を一つにする
    # 文末の「、」は削除
    text_ = re.sub(r'、+', '、', text_)
    text_ = re.sub(r'、$', "", text_)

    # 連続する「。、」を「。」におきかえる
    text_ = re.sub(r'[。、]+。[。、]+', '。', text_)

    # 連続する「？」を含む句読点を「？」におきかえる
    text_ = re.sub(r'[？。、]*？[？。、]*', '？', text_)

    return text_