[解決!Python]文字列が英字(文字)のみで構成されているかどうかを判定するには(isalpha/isasciiメソッド、re.match/re.fullmatch関数)解決!Python

文字列のisalphaメソッドを使うとそれが英字のみで構成されているかどうかを調べられる。その使い方と注意点、正規表現を使って同様な処理を行う方法を紹介する。

» 2021年02月02日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

s = 'Deep'
result = s.isalpha()  # 英字(文字)のみで構成されているかどうかを判定
print(f'"{s}" is alpha:', result)  # "Deep" is alpha: True

s = 'Deep Insider'
result = s.isalpha()  # 空白文字は英字(文字)には含まれない
print(f'"{s}" is alpha:', result)  # "Deep Insider" is alpha: False

s = 'AI初学者のためのサイト'
result = s.isalpha()  # ひらがな/カタカナ/漢字も文字として判定される
print(f'"{s}" is alpha:', result)  # "AI初学者のためのサイト" is alpha: True

# isalphaメソッドとisasciiメソッドを組み合わせる
string_list = ['Deep Insider', 'DeepInsider', 'AI初学者のためのサイト']
for item in string_list:
    if item.isalpha():
        if item.isascii():
            print(f'"{item}" includes only alphabets')
        else:
            print(f'"{item}" includes letter characters')
    else:
        print(f'"{item}" includes non-letter characters')
# 出力結果:
# "Deep Insider" includes non-letter characters
# "DeepInsider" includes only alphabets
# "AI初学者のためのサイト" includes letter characters

# 正規表現を使用する
import re

string_list = ['Deep Insider', 'DeepInsider', 'AI初学者のためのサイト']
for item in string_list:
    if re.fullmatch('[a-zA-Z]+', item):  # re.match('^[a-zA-Z]+$', 'deep')
        print(f'"{item}" includes only alphabets')
    else:
        print(f'"{item}" includes non-alphabetic characters')
# 出力結果:
# "Deep Insider" includes non-alphabetic characters
# "DeepInsider" includes only alphabets
# "AI初学者のためのサイト" includes non-alphabetic characters


文字列が英字のみで構成されているかを判定する

 Pythonの文字列にはさまざまな文字種判定メソッドが用意されている。その中で、文字列が英字のみで構成されているかどうかを判定するにはisalphaメソッドが使える。これは文字列に含まれている全ての文字が英字(文字)ならばTrueを返し、そうでなければFalseを返す。

 以下に簡単な例を示す。

s = 'Deep'
result = s.isalpha()  # 英字(文字)のみで構成されているかどうかを判定
print(f'"{s}" is alpha:', result)  # "Deep" is alpha: True


 この例では英語の大文字と小文字を含んだ'Deep'という文字列でisalphaメソッドを呼び出している。その結果はもちろんTrueとなる。

 これに対して、半角空白文字を含んだ'Deep Insider'でisalphaメソッドを呼び出すと、以下に示すようにその結果はFalseとなる。

s = 'Deep Insider'
result = s.isalpha()  # 空白文字は英字(文字)には含まれない
print(f'"{s}" is alpha:', result)  # "Deep Insider" is alpha: False


 isalphaメソッドは文字列に含まれるユニコード文字の中で、ユニコード文字データベースのGeneral_Categoryプロパティの値が「Letter」に分類されるものを英字(alphabetic character)として判定する。具体的には、このプロパティの値が「Lu(Uppercase_Letter)」「Ll(Lowercase_Letter)」「Lt(Titlecase_Letter)」「Lm(Modifier_Letter)」「Lo(Other_Letter)」となっているものが該当する。空白文字のGeneral_Categoryプロパティの値は「Zs(Space_Separator)」であるため、上のような結果となる。

 実は、日本語のひらがなやカタカナ、漢字の多くでは、General_Categoryプロパティの値は今述べたLetterに分類されるものとなっている。そのため、以下のように英字ではない、日本語の文字についてもisalphaメソッドはTrueを返すことには注意が必要だ。

s = 'AI初学者のためのサイト'
result = s.isalpha()  # ひらがな/カタカナ/漢字も文字として判定される
print(f'"{s}" is alpha:', result)  # "AI初学者のためのサイト" is alpha: True


 何らかの理由で、文字列全体が英大文字/小文字のみで構成されているかどうかを判定したい場合には、isalphaメソッドとisasciiメソッドを組み合わせる方法が考えられる。

string_list = ['Deep Insider', 'DeepInsider', 'AI初学者のためのサイト']
for item in string_list:
    if item.isalpha():
        if item.isascii():
            print(f'"{item}" includes only alphabets')
        else:
            print(f'"{item}" includes letter characters')
    else:
        print(f'"{item}" includes non-letter characters')
# 出力結果:
# "Deep Insider" includes non-letter characters
# "DeepInsider" includes only alphabets
# "AI初学者のためのサイト" includes letter characters


Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。