codingecho

日々の体験などを書いてます

Pythonで文字列に絵文字と半角カタカナが含まれているか判定する

ここではPython 3.7を使った方法を紹介します。

絵文字の判定

現時点の最新版であるUnicode® Emoji Charts v11.0では、絵文字のUnicodeは1F600から1F3F4の範囲でコードが振られています。

なので、Unicodeの範囲を指定すればいけるじゃんと思っていたのですが、絵文字についてはUnicodeが連番ではなかったので正規表現で範囲を指定した方法ができませんでした。WikipediaのUnicode表を参考に範囲を指定していますが、絵文字以外も判定されてしまいます。

以下がダメなサンプルコードです。

text = '今日はいい天気'
if re.search('[\U00010000-\U0010ffff]|[\U000000A9-\U00003299]', text):
    print('found it!')
else:
    print('not found')

ちなみに、新しい絵文字を扱うため \U (UTF-32) を使っています。

上記のサンプルコードの範囲の間にはひらがななどの絵文字ではない文字が含まれているのでこのコードでは絵文字を判定できません。

いろいろ調べてみて最終的にemojiというライブラリが良さそうなのでこちらを使用しました。

import emoji

def text_is_emoji(text):
    for c in text:
        if c in emoji.UNICODE_EMOJI:
            return True
    return False

text = '今日はいい天気'

if text_is_emoji(text):
    print('found it!')
else:
    print('not found')

結果

not found
import emoji

def text_is_emoji(text):
    for c in text:
        if c in emoji.UNICODE_EMOJI:
            return True
    return False

text = '今日はいい天気☀️'

if text_is_emoji(text):
    print('found it!')
else:
    print('not found')

結果

found it!

半角カタカナの判定

半角カタカナのUnicodeはFF61からFF9Fまでの範囲が決まっていので簡単です。

以下は半角カタカナを判定するサンプルコードです。UnicodeのエンコーディングにはUTF-8を使います。

全角カタカナ

import re

text = '今日はイイ天気'
if re.search('[\uFF61-\uFF9F]', text):
    print('found it!')
else:
    print('not found')

結果

not found

半角カタカナ

import re

text = '今日はイイ天気'
if re.search('[\uFF61-\uFF9F]', text):
    print('found it!')
else:
    print('not found')

結果

found it!

正規表現で UTF-8 と UTF-32 の扱いかた

Pythonの正規表現でUnicodeを扱うにはコードの前に \u または \U を使用します。

UTF-8の場合は \u、UTF-32の場合は \U を使います。詳しくは公式ドキュメントを参照してください。

おわりに

絵文字に関してはUnicode® Emoji Charts v11.0のようにバージョンが振られていることからもわかるように、絵文字の数が年々増えています。なので、絵文字が正しく判定されているか適宜見直していく必要がありそうです。

参考