[解決!Python]文字列が英字(文字)のみで構成されているかどうかを判定するには(isalpha/isasciiメソッド、re.match/re.fullmatch関数):解決!Python
文字列のisalphaメソッドを使うとそれが英字のみで構成されているかどうかを調べられる。その使い方と注意点、正規表現を使って同様な処理を行う方法を紹介する。
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
あるいは、例えば、正規表現を扱うreモジュールのmatch関数やfullmatch関数を使う方法もある。fullmatch関数は引数に指定したパターンが、マッチ対象の文字列にマッチしたときにはマッチした部分を表すre.Matchオブジェクトを、マッチしなかったときには戻り値を返さない(Noneを返す)。このことを利用して、以下のようなコードを書けるだろう。
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
ここでは、正規表現として「[a-zA-Z]+」を使用しているが、これは「1文字以上の連続する英小文字と大文字」を意味する。「単語を構成する文字」を表す文字クラス「\w」を使ってもよさそうだが、これだと数字やアンダースコアも含まれるし、isalphaメソッドと同様に日本語の文字までマッチしてしまうので、その際にはmatch関数やfullmatch関数の第3引数にre.ASCIIフラグを指定して、ASCII範囲の文字のみをマッチの対象とするなどした方がよいかもしれない。
print('without re.ASCII flag')
s = 'AI初学者のためのサイト'
if re.match(r'^\w+$', item):
print(f'"{item}" includes only alphabets')
else:
print(f'"{item}" includes non-alphabetic characters')
print('---')
print('with re.ASCII flag')
s = 'AI初学者のためのサイト'
if re.match(r'^\w+$', item, re.ASCII):
print(f'"{item}" includes only alphabets')
else:
print(f'"{item}" includes non-alphabetic characters')
# 出力結果:
# without re.ASCII flag
# "AI初学者のためのサイト" includes only alphabets
# with re.ASCII flag
# "AI初学者のためのサイト" includes non-alphabetic characters
[]の中にはマッチさせたい任意の文字を含めることができるので、isalphaメソッドよりも柔軟に文字種の判定を行えることは覚えておこう。
Copyright© Digital Advantage Corp. All Rights Reserved.