Posted at

Pythonで集合を使ったひらがなチェック


背景

初めて開発案件に携わったこともあり、自分もQiitaに投稿してみたくなった。

担当案件で外部ファイルから読み込んだ文字列が、全てひらがなで構成されているかチェックする必要があり、処理を書いたのでそのメモ。


判定の考え方

文字列を構成する文字の集合とひらがな全体の集合の共通集合を取り、その結果で判定する。


  • 結果が与えられた文字列の文字集合と同じ:ひらがなのみ

  • 結果が与えられた文字列の文字集合と異なる:ひらがな以外が混ざってる

def validate_given_word_is_consisted_of_hiragana(word):

kana_set = {chr(i) for i in range(12353, 12436)}
word_set = set(word)
if word_set & kana_set != word_set:
return '"{}"には平仮名以外の文字が含まれてます'.format(word)
else:
return '"{}"は平仮名だけで構成されています'.format(word)

なお、全てひらがなではなく、1文字でもひらがなを含む文字列かを判定したい場合、ひらがな全体の集合と文字列を構成する文字の集合の差集合を取り、その結果で判定するとよい。


  • 結果がひらがな全体の集合と同じ:ひらがなは含まれていない

  • 結果がひらがな全体の集合と異なる:ひらがなが含まれている

def validate_given_word_is_including_hiragana(word):

kana_set = {chr(i) for i in range(12353, 12436)}
word_set = set(word)
if kana_set - word_set == kana_set:
return '"{}"には平仮名は含まれていません'.format(word)
else:
return '"{}"には平仮名が含まれています'.format(word)

実際に動作確認してみたソース。


validate.py

def validate_given_word_is_consisted_of_hiragana(word):

kana_set = {chr(i) for i in range(12353, 12436)}
word_set = set(word)
if word_set & kana_set != word_set:
return '"{}"には平仮名以外の文字が含まれてます'.format(word)
else:
return '"{}"は平仮名だけで構成されています'.format(word)

def validate_given_word_is_including_hiragana(word):
kana_set = {chr(i) for i in range(12353, 12436)}
word_set = set(word)
if kana_set - word_set == kana_set:
return '"{}"には平仮名は含まれていません'.format(word)
else:
return '"{}"には平仮名が含まれています'.format(word)

if __name__ == "__main__":
print(validate_given_word_is_consisted_of_hiragana('やきにく'))
print(validate_given_word_is_consisted_of_hiragana('焼き肉'))

print(validate_given_word_is_including_hiragana('焼き肉'))
print(validate_given_word_is_including_hiragana('焼肉'))


上ソースの出力結果。

"やきにく"は平仮名だけで構成されています

"焼き肉"には平仮名以外の文字が含まれてます
"焼き肉"には平仮名が含まれています
"焼肉"には平仮名は含まれていません


参考

文字列の集合を作るときに参考にさせていただきました。

[python] いろいろな文字種のリストを作成