文字列

【Python】文字列に含まれる文字の種類を判定する方法

【Python】文字列に含まれる文字の種類を判定する方法

Pythonで文字列に含まれる文字の種類を判定する方法について解説します。文字種類判定のメソッドはいくつかあるので目的に合わせて使い分けましょう。

文字列に含まれる文字種類の判定メソッド

Pythonで文字列に含まれる文字の種類を判定するにはstrクラスの文字種類判定用のメソッドを使用することができます。

strクラスの文字種類判定のメソッドの名前は「isxxxxx」というように、isから始まるメソッドになっているのが特徴です。

文字種類の判定メソッドとしては、以下のようなものがあります。

メソッド名概要説明
isdecimal10進数値であるかを判定する
isdigit数値であるかを判定する
isnumeric数値文字であるかを判定する
isalnum英数字であるかを判定する
isalpha英字であるかを判定する
isasciiASCII文字であるかを判定する
islower小文字であるかを判定する
isupper大文字であるかを判定する
istitle単語の先頭文字だけが大文字の文字列であるかを判定する
isprintable印字可能な文字であるかを判定する
isspace空白文字であるかを判定する
isidentifier有効な識別子であるかを判定する

strクラスのメソッドではありませんが、予約済みのキーワードである識別する場合はkeywordモジュールのメソッドが使用できます。

メソッド名概要説明
keyword.iskeyword予約済みのキーワードであるかを判定する

以降では、上記の各メソッドの使い方を簡単な使用例を見せつつご紹介します。

各種判定メソッドの使い方

10進数値であるかを判定する isdecimal

10進数であるかを判定するためには、isdecimalメソッドを使用します。

print("=== isdecimal ===")
print("12345".isdecimal())
print("0b0101".isdecimal())
【実行結果】
=== isdecimal ===
True
False

isdecimalメソッドでは、文字列中の全てが十進数字で、かつ1文字以上である場合はTrueを、そうでない場合はFalseを返却します。十進数字は、Unicodeの一般カテゴリ「Nd (Decimal_Number)」に含まれる文字を指します。

Note

isdecimalの公式ドキュメントの記載はこちらを参照してください。

数値であるかを判定する isdigit

数値であるかを判定するためには、isdigitメソッドを使用します。

print("=== isdigit ===")
print("12345".isdigit())
print("0b0101".isdigit())
【実行結果】
=== isdigit ===
True
False

isdigitメソッドでは、文字列中の全ての文字が数字で、かつ1文字以上の場合にTrueを、そうでない場合はFalseを返却します。ここでの数字は十進数字に加えて上付き数字等のような数字を含みます。

Note

isdigitの公式ドキュメントの記載はこちらを参照してください。

数値文字であるかを判定する isnumeric

数値文字(漢数字、ローマ数字など含む)であるかを判定するためには、isnumericメソッドを使用します。

print("=== isnumeric ===")
print("一万五千".isnumeric())
print("0b0101".isnumeric())
【実行結果】
=== isnumeric ===
True
False

isnumericメソッドでは、文字列中の全ての文字が漢数字やローマ数字等のような数を表す文字で、かつ1文字以上の場合はTrueを、そうでない場合はFalseを返却します。

Note

isnumericの公式ドキュメントの記載はこちらを参照してください。

isdecimal、isdigit、isnumericの結果の違い

上記の例ではisdecimal、isdigit、isnumericの結果の違いは少し分かりにくいため、結果の違いをまとめます。

文字種類isdecimalメソッドisdigitメソッドisnumericメソッド
半角数字(‘12345’)TrueTrueTrue
上付き/下付き数字(‘⁰₀’)FalseTrueTrue
全角数字(‘12345’)TrueTrueTrue
漢数字(‘一弐参肆伍’)FalseFalseTrue
ローマ数字(‘ⅠⅡⅢⅣⅤ’)FalseFalseTrue

isdecimalメソッドでは、上付き/下付き数字(‘⁰₀’)のようなものを判定することができませんが、isdigitメソッドを使えば判定することができます。また、漢数字/ローマ数字のような文字も判定するには、isnumericメソッドを使えば判定することができます。

広い範囲で数字を判定したい場合には、isnumericメソッドを利用しましょう。

以下は上記の表における判定確認のためのサンプルプログラムです。

print("--- 半角数字('12345')")
print(f'isdecimal: {"12345".isdecimal()}')
print(f'isdigit: {"12345".isdigit()}')
print(f'isnumeric: {"12345".isnumeric()}')

print("--- 上付き数字、下付き数字('⁰₀')")
print(f'isdecimal: {"⁰₀".isdecimal()}')
print(f'isdigit: {"⁰₀".isdigit()}')
print(f'isnumeric: {"⁰₀".isnumeric()}')

print("--- 全角数字('12345')")
print(f'isdecimal: {"12345".isdecimal()}')
print(f'isdigit: {"12345".isdigit()}')
print(f'isnumeric: {"12345".isnumeric()}')

print("--- 漢数字('一弐参肆伍')")
print(f'isdecimal: {"一弐参肆伍".isdecimal()}')
print(f'isdigit: {"一弐参肆伍".isdigit()}')
print(f'isnumeric: {"一弐参肆伍".isnumeric()}')

print("--- ローマ数字('ⅠⅡⅢⅣⅤ')")
print(f'isdecimal: {"ⅠⅡⅢⅣⅤ".isdecimal()}')
print(f'isdigit: {"ⅠⅡⅢⅣⅤ".isdigit()}')
print(f'isnumeric: {"ⅠⅡⅢⅣⅤ".isnumeric()}')
【実行結果】
--- 半角数字('12345')
isdecimal: True
isdigit: True
isnumeric: True
--- 上付き数字、下付き数字('⁰₀')
isdecimal: False
isdigit: True
isnumeric: True
--- 全角数字('12345')
isdecimal: True
isdigit: True
isnumeric: True
--- 漢数字('一弐参肆伍')
isdecimal: False
isdigit: False
isnumeric: True
--- ローマ数字('ⅠⅡⅢⅣⅤ')
isdecimal: False
isdigit: False
isnumeric: True

英数字であるかを判定する isalnum

英数字であるかを判定するためには、isalnumメソッドを使用します。

print("=== isalnum ===")
print("abc12345".isalnum())
print("abc+-*".isalnum())
【実行結果】
=== isalnum ===
True
False

isalnumメソッドでは、文字列中の全ての文字が英数字で、かつ1文字以上の場合はTrue、そうでない場合はFalseを返却します。

Note

isalnumの公式ドキュメントの記載はこちらを参照してください。

英字であるかを判定する isalpha

英字であるかを判定するためには、isalphaメソッドを使用します。

print("=== isalpha ===")
print("abcdefgh".isalpha())
print("abc12345".isalpha())
【実行結果】
=== isalpha ===
True
False

isalphaメソッドでは、文字列中の全ての文字が英字で、かつ1文字以上の場合はTrue、そうでない場合はFalseを返却します。英字は、Unicodeの文字データベースで”Leter”として定義されているものです。

Note

isalphaの公式ドキュメントの記載はこちらを参照してください。

ASCII文字であるかを判定する isascii

ASCII文字であるかを判定するためには、isasciiメソッドを使用します。isasciiメソッドはPython3.7で追加されたメソッドになります。

print("=== isascii ===")
print("abcdefgh".isascii())
print("あいうえお".isascii())
【実行結果】
=== isascii ===
True
False

isasciiメソッドでは、文字列が空であるか、文字列の全ての文字がASCII文字である場合はTrue、そうでない場合はFalseを返却します。

Note

isasciiの公式ドキュメントの記載はこちらを参照してください。

小文字であるかを判定する islower

小文字であるかを判定するためには、islowerメソッドを使用します。

print("=== islower ===")
print("python".islower())
print("PYTHON".islower())
【実行結果】
=== islower ===
True
False

islowerメソッドでは、大文字/小文字の区別のある文字の全てが小文字で、かつ大文字/小文字の区別のある文字が1文字以上である場合はTrue、そうでない場合はFalseを返却します。

ここで「大文字/小文字の区別のある文字」とは、Unicodeの一般カテゴリが”Lu”(Letter, Uppercase: 大文字)、”Ll”(Leter, Lowercase: 小文字)、”Lt”(Letter, Titlecase: 先頭が大文字)のいずれかであるものです。

Note

islowerの公式ドキュメントの記載はこちらを参照してください。

大文字であるかを判定する isupper

大文字であるかを判定するためには、isupperメソッドを使用します。

print("=== isupper ===")
print("PYTHON".isupper())
print("python".isupper())
【実行結果】
=== isupper ===
True
False

isupperメソッドでは、大文字/小文字の区別のある文字の全てが大文字で、かつ大文字/小文字の区別のある文字が1文字以上である場合はTrue、そうでない場合はFalseを返却します。

ここで「大文字/小文字の区別のある文字」とは、Unicodeの一般カテゴリが”Lu”(Letter, Uppercase: 大文字)、”Ll”(Leter, Lowercase: 小文字)、”Lt”(Letter, Titlecase: 先頭が大文字)のいずれかであるものです。

Note

isupperの公式ドキュメントの記載はこちらを参照してください。

単語の先頭文字だけが大文字の文字列であるかを判定する ~istitleメソッド~

文字列の単語の先頭文字だけが大文字の文字列であるかを判定するには、istitleメソッドを使用します。

print("=== istitle ===")
print("Python Program".istitle())
print("python program".istitle())
【実行結果】
=== istitle ===
True
False

istitleメソッドでは、文字列がタイトルケース文字列(先頭文字だけが大文字)であり、かつ1文字以上ある場合はTrue、そうでない場合はFalseを返却します。

Note

istitleの公式ドキュメントの記載はこちらを参照してください。

印字可能な文字であるかを判定する isprintable

印字可能な文字であるかを判定するためには、isprintableメソッドを使用します。

print("=== isprintable ===")
print("Python Program".isprintable())
print("Python\nProgram".isprintable())
【実行結果】
=== isprintable ===
True
False

isprintableメソッドでは、文字列中の全ての文字が印字可能であるか、文字列が空である場合はTrue、そうでない場合はFalseを返却します。

非印字可能文字(印字ができない文字)は、Unicodeで”Other”または”Separator”と定義されている文字でASCII space (0x20)以外のものになります。

Note

isprintableの公式ドキュメントの記載はこちらを参照してください。

空白文字であるかを判定する isspace

空白文字であるかを判定するためには、isspaceメソッドを使用します。

print("=== isspace ===")
print(" ".isspace())
print("abcdefgh".isspace())
【実行結果】
=== isspace ===
True
False

isspaceメソッドでは、文字列が空白文字からだけからなり、かつ1文字以上の場合はTrue、そうでない場合はFalseを返却します。

Unicodeで一般カテゴリが”Zs”(Separator, space)か、双方向クラスが”WS”, “B”, “S”のいずれかである場合、空白文字(whitespace)となります。双方向クラスと言っているのは、左横書き(左から右に書く)、右横書き(右から左に書く)が混在するテキストのことを言います。

Note

isspaceの公式ドキュメントの記載はこちらを参照してください。

有効な識別子であるかを判定する isidentifier

文字列がPythonで有効な識別子であるかを判定するためには、isidentifierメソッドを使用します。識別子と言っているのは、変数や関数、クラス名で使用できるものです。

print("=== isidentifier ===")
print("pytyon_12345".isidentifier())
print("python-12345".isidentifier())
【実行結果】
=== isidentifier ===
True
False

isidentifierメソッドでは、文字列が識別子(identifier)及びキーワード(keyword)のページで定義されている有効な識別子である場合はTrue、そうでない場合はFalseを返却します。

詳細な識別子の定義は上記リンク先の公式ドキュメントを参照してください。上記例ではアンダースコア(_)は識別子として使えるのでTrueになりますが、ハイフン(-)は識別子として使えないためFalseとなります。

Note

isidentifierの公式ドキュメントの記載はこちらを参照してください。

予約済みのキーワードであるかを判定する keyword.iskeyword

文字列が予約済みのキーワードであるかを判定するためには、keywordモジュールのiskeywordメソッドを使用します。

from keyword import iskeyword

print("python")
print(f"identifier: {'python'.isidentifier()}")
print(f"iskeyword: {iskeyword('python')}\n")

# 予約済みキーワードの場合
print("class")
print(f"identifier: {'class'.isidentifier()}")
print(f"iskeyword: {iskeyword('class')}")
【実行結果】
python
identifier: True
iskeyword: False

class
identifier: True
iskeyword: True

Pythonにおいてキーワード(keyword)のページで定義されている識別子は、予約語、またはPythonにおけるキーワード(keyword)として扱われるため通常の識別子として使うことができません。プログラムの文法上で必要になってくるclass, def, if, else等々が該当します。

上記例で’python’という文字列は識別子にできるのでidentifierはTrueですが、予約語ではないためiskeywordはFalseになります。一方で、’class’は予約語であるため、iskeywordもTrueとなります。

Note

keyword.iskeywordの公式ドキュメントの記載はこちらを参照してください。

まとめ

Pythonで文字列に含まれる文字の種類を判定する方法について解説しました。

数値等を判定するメソッドからPythonの識別子やキーワードを判定するメソッドについても紹介しています。文字種類判定のメソッドはいくつもあるので目的に合わせてうまく使い分けてみてください。