【Python】全角文字に isalpha メソッドを使う方法

何の記事??

Python の isalpha メソッドを全角文字に使うときに True が返ってしまう問題へのアプローチを紹介します。


isalphaメソッド

そもそも isalpha メソッドとはどんなメソッドなのかを確認してみます。

メソッドの名前の通り、アルファベットの文字列だったら True を返すというメソッドです。

>>> "abc".isalpha()
True

上記のように abc はアルファベットですので、もちろん True が返却されますね。期待通りですね!!

それでは次に以下のコードをみてみましょう。アルファベットと数字が混ざった文字列です。

>>> "1a2b3c".isalpha()
False

これはアルファベットだけではなく数字が混ざっているので False が返却されます。これも期待通りですね!!


問題点

それでは、今回問題になるプログラムを見てみましょう。

>>> "あいう".isalpha()
True

今度はアルファベットではなく「あいう」という日本語に対して isalphaメソッドを使ってみたところ・・・なんと True が返却されました!!

「あいう」はアルファベットではないので、False が返却される想定でしたが、True が返却されてしまいました。


原因

docs.python.org

上記公式リファレンスにある通り、Python の isalphaメソッドでは、Alphabetic characters are those characters defined in the Unicode character database as “Letter”, i.e., those with general category property being one of “Lm”, “Lt”, “Lu”, “Ll”, or “Lo”. の場合に True になると書いてありますね。

つまり日本語は Lo に値するため True が返却されたということです。

プログラムで確認したい方は以下を実行してみてください。

>>> [unicodedata.category(c) for c in "あいう"]
['Lo', 'Lo', 'Lo']

解決策

上述の通り、バグではなく仕様ということですが期待した結果にしたいという方は一度 UTF-8 にエンコードしてあげることで対処できます。

>>> "あいう".encode('utf-8').isalpha()
False

期待した通り「あいう」に対してアルファベットではないので False が返却されましたね!


最後に

実は前にどハマりしてしまったことがあり、、、自信がないメソッドはきちんとリファレンスをみないとだなぁと改めて感じました笑