[解決!Python]文字列が英数字(文字および数字)のみで構成されているかどうかを判定するには(isalnum/isasciiメソッド、正規表現)解決!Python

isalnumメソッドとisasciiメソッドと組み合わせて、あるいは正規表現を使って文字列が半角英数字のみで構成されているかどうかを調べる方法を紹介する。

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

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

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

連載目次

# 文字列が半角の英数字のみで構成されているかどうかを判定
def isalnum_ascii(s):  # 文字列のメソッドを使用
    return True if s.isalnum() and s.isascii() else False

import re

def isalnum_ascii_re(s):  # 正規表現を使用
    return True if re.fullmatch('[\d\w]+', s, re.ASCII) else False

s1 = '123abc'
s2 = '123abc'
s3 = '123漢字ひらカタ'

r1 = isalnum_ascii(s1)
r2 = isalnum_ascii(s2)
r3 = isalnum_ascii(s3)
print(f'{s1} isalnum_ascii: {r1}'# 123abc isalnum_ascii: True
print(f'{s2} isalnum_ascii: {r2}'# 123abc isalnum_ascii: False
print(f'{s3} isalnum_ascii: {r3}'# 123漢字ひらカタ isalnum_ascii: False

r1 = isalnum_ascii_re(s1)
r2 = isalnum_ascii_re(s2)
r3 = isalnum_ascii_re(s3)
print(f'{s1} isalnum_ascii_re: {r1}'# 123abc isalnum_ascii_re: True
print(f'{s2} isalnum_ascii_re: {r2}'# 123abc isalnum_ascii_re: False
print(f'{s3} isalnum_ascii_re: {r3}'# 123漢字ひらカタ isalnum_ascii_re: False

# 文字列が英数字(文字および数字)のみで構成されているかどうかを判定
s1 = '123abc'
s2 = '123abc'
s3 = '123漢字ひらカタ'

r1 = s1.isalnum()
r2 = s2.isalnum()
r3 = s3.isalnum()
print(f'{s1} isalnum: {r1}'# 123abc isalnum: True
print(f'{s2} isalnum: {r2}'# 123abc isalnum: True
print(f'{s3} isalnum: {r3}'# 123漢字ひらカタ isalnum: True


文字列が英数字のみで構成されているかどうかをisalnumメソッドや正規表現を使って判定する

 Pythonの文字列にはisalnumメソッドがある。このメソッドは「文字列中の全ての文字が英数字で、かつ 1 文字以上あるなら True を、そうでなければ False」を返す。実際には、このメソッドは文字列中の全ての文字が、isalpha/isdecimal/isdigit/isnumericのいずれかのメソッドでTrueを返すのであればTrueを、そうでなければFalseを返す。このことから、このメソッドで「文字列が半角英数字のみで構成されているかどうか」を判定する際には注意が必要となる。

 以下に例を示す。

s1 = '123abc'
s2 = '123abc'
s3 = '123漢字ひらカタ'

r1 = s1.isalnum()
r2 = s2.isalnum()
r3 = s3.isalnum()
print(f'{s1} isalnum: {r1}'# 123abc isalnum: True
print(f'{s2} isalnum: {r2}'# 123abc isalnum: True
print(f'{s3} isalnum: {r3}'# 123漢字ひらカタ isalnum: True


 変数s1、s2、s3にはそれぞれ半角英数字のみ、全角英数字のみ、半角数字と漢字/ひらがな/カタカナで構成される文字列が代入されている。しかし、これらに対してisalnumメソッドを呼び出すと、その結果は全てTrueとなる。

 既に述べた通り、isalnumメソッドは文字列がisalpha/isdecimal/isdigit/isnumericメソッドでTrueと判定される文字だけで構成されているとTrueを返す。そして、これらのメソッドは全角英数字や漢字、ひらがな、カタカナについてもTrueを返すようになっている。以下は半角英数字、全角英数字、漢字、ひらがな、カタカナについてisalphaメソッドとisdecimalメソッドを呼び出した結果だ。

s1 = 'ABC'
s2 = 'ABC'
s3 = '漢字ひらがなカタカナ'
s4 = '123'
s5 = '123'

r1 = s1.isalpha()
r2 = s2.isalpha()
r3 = s3.isalpha()
print(f'{s1} isalpha: {r1}'# ABC isalpha: True
print(f'{s2} isalpha: {r2}'# ABC isalpha: True
print(f'{s3} isalpha: {r3}'# 漢字ひらがなカタカナ isalpha: True

r4 = s4.isdecimal()
r5 = s5.isdecimal()
print(f'{s4} isdecimal: {r4}'# 123 isdecimal: True
print(f'{s5} isdecimal: {r5}'# 123 isdecimal: True


 全角のアルファベットや漢字、ひらがな、カタカナについてisalphaメソッドがTrueを返していることと、全角数字についてisdecimalメソッドがTrueを返していることに注目されたい。こうしたことから、isalnumメソッドだけでは、文字列が半角英数字のみで構成されているかどうかは分からない(もちろん、文字と数字でのみ文字列が構成されているかどうかを調べるのであればisalnumメソッドをそのまま使えばよい)。

 文字列が半角英数字のみで構成されているかどうかを判定するには、isalnumメソッドとisasciiメソッドを組み合わせるとよい。isasciiメソッドは文字列を構成する全ての文字がASCIIの範囲に含まれるものであればTrueを、そうでなければFalseを返送する。isalnumメソッドの結果がTrueかつisasciiメソッドの結果がTrueであれば、その文字列は半角英数字で構成されていると考えられるだろう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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