Help us understand the problem. What is going on with this article?

カタカナから母音のカナに変換する【python】

概要

「コンニチハ->オンイイア」みたいに、カタカナ文字列を入力したら、その母音を返す関数を作りました。

変換ルール

「ン」「ッ」はそのままにする(例:ルンパッパ -> ウンアッア)
「ー」(長音)は直前の母音と同一にする(例:コーラ -> オオア)
「ゥ」は直前のカナが「ト」「ド」の場合、それと合わせて一つの文字とみなし、大文字と同じく扱う(例:ドゥッキ -> ウッイ、ゥアア -> ウアア)
「ャ」「ェ」「ョ」は直前がカナがイ段の場合、直前のカナと合わせて一つの文字とみなし、それ以外の場合は大文字と同じく扱う。(例:キャタツ -> アアウ、キェェ -> エエ)
「ュ」は直前のカナがイ段、「テ」「デ」の場合、それと合わせて一つのカナとみなし、それ以外の場合は大文字と同じく扱う(例:チュール -> ウウウ、デュワー -> ウアア)
「ヮ」「ァ」「ェ」「ォ」は直前のカナがウ段の場合、それと合わせて一つのカナとみなし、それ以外の場合は大文字と同じく扱う。(例:ウェーイ -> エエイ)
「ィ」は直前のカナがウ段、「テ」「デ」の場合、それと合わせて一つのカナとみなし、それ以外の場合は大文字と同じく扱う(例:レモンティー -> エオンイイ、ィエア -> イエア)
カタカナ以外の文字はそのままにする。

環境

Google Colaboratory(2020年3月27日時点)およびmacOS Catalina, Python3.8.0での実行を確認しています。

コード

def kana2vowel(text):
    #大文字とゥの変換リスト
    large_tone = {
        'ア' :'ア', 'イ' :'イ', 'ウ' :'ウ', 'エ' :'エ', 'オ' :'オ',
        'ゥ': 'ウ', 'ヴ': 'ウ',
        'カ' :'ア', 'キ' :'イ', 'ク' :'ウ', 'ケ' :'エ', 'コ' :'オ',
        'サ' :'ア', 'シ' :'イ', 'ス' :'ウ', 'セ' :'エ', 'ソ' :'オ',
        'タ' :'ア', 'チ' :'イ', 'ツ' :'ウ', 'テ' :'エ', 'ト' :'オ',
        'ナ' :'ア', 'ニ' :'イ', 'ヌ' :'ウ', 'ネ' :'エ', 'ノ' :'オ',
        'ハ' :'ア', 'ヒ' :'イ', 'フ' :'ウ', 'ヘ' :'エ', 'ホ' :'オ',
        'マ' :'ア', 'ミ' :'イ', 'ム' :'ウ', 'メ' :'エ', 'モ' :'オ',
        'ヤ' :'ア', 'ユ' :'ウ', 'ヨ' :'オ',
        'ラ' :'ア', 'リ' :'イ', 'ル' :'ウ', 'レ' :'エ', 'ロ' :'オ',
        'ワ' :'ア', 'ヲ' :'オ', 'ン' :'ン', 'ヴ' :'ウ',
        'ガ' :'ア', 'ギ' :'イ', 'グ' :'ウ', 'ゲ' :'エ', 'ゴ' :'オ',
        'ザ' :'ア', 'ジ' :'イ', 'ズ' :'ウ', 'ゼ' :'エ', 'ゾ' :'オ',
        'ダ' :'ア', 'ヂ' :'イ', 'ヅ' :'ウ', 'デ' :'エ', 'ド' :'オ',
        'バ' :'ア', 'ビ' :'イ', 'ブ' :'ウ', 'ベ' :'エ', 'ボ' :'オ',
        'パ' :'ア', 'ピ' :'イ', 'プ' :'ウ', 'ペ' :'エ', 'ポ' :'オ'
    }

    #ト/ド+'ゥ'をウに変換
    for k in 'トド':
        while k+'ゥ' in text:
            text = text.replace(k+'ゥ','ウ')
    #テ/デ+ィ/ュをイ/ウに変換
    for k in 'テデ':
        for k2,v in zip('ィュ','イウ'):
            while k+k2 in text:
                text = text.replace(k+k2,v)

    #大文字とゥを母音に変換
    text = list(text)
    for i, v in enumerate(text):
        if v in large_tone:
            text[i] = large_tone[v]
    text = ''.join(text)

    #ウーをウウに変換
    while 'ウー' in text:
        text = text.replace('ウー','ウウ')

    #ウ+ヮ/ァ/ィ/ェ/ォを母音に変換
    for k,v in zip('ヮァィェォ','アアイエオ'):
        text = text.replace('ウ'+k,v)

    #イー/ィーをイイ/ィイに変換
    for k in 'イィ':
        while k+'ー' in text:
            text = text.replace(k+'ー',k+'イ')

    #イ/ィ+ャ/ュ/ェ/ョを母音に変換
    for k,v in zip('ャュェョ','アウエオ'):
        text = text.replace('イ'+k, v).replace('ィ'+k, v)

    #残った小文字を母音に変換
    for k,v in zip('ヮァィェォャュョ','アアイエオアウオ'):
        text = text.replace(k,v)

    #ー(長音)を母音に変換する
    for k in 'アイウエオ':
        while k+'ー' in text:
            text = text.replace(k+'ー',k+k)

    return text
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away