Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで文字列がASCIIのみで構成されているかどうかを確認する方法

Pythonで文字列がすべてASCII文字だけで構成されているかどうかを判定したい場面は少なくありません。ここでは、代表的な2つの方法をわかりやすく解説します。

方法1:all()とord()を使って1文字ずつチェックする

最もシンプルな方法は、文字列内の各文字を順番に調べ、その文字コード(Unicodeコードポイント)が128未満であるかを確認することです。ASCIIは0〜127のコードポイントで定義されているため、すべての文字がこの範囲内であれば、その文字列はASCIIのみで構成されていると判断できます。

def is_ascii(s):
    return all(ord(c) < 128 for c in s)

print(is_ascii('ӓmsterdӓm'))

出力結果

False

この例では「ӓ」という非ASCII文字が含まれているため、Falseが返されます。

ただし、この方法は文字数分だけループ処理を行うため、長い文字列に対しては効率が悪いという欠点があります。

方法2:encode('ascii')を試して例外をキャッチする

より効率的な方法は、文字列をASCIIとしてエンコードできるかどうかを試し、例外の発生有無で判定するアプローチです。Python 3では、str.encode('ascii')を実行し、変換できない文字が含まれていればUnicodeEncodeErrorが発生します。これを利用して判定できます。

mystring = 'ӓmsterdӓm'

try:
    mystring.encode('ascii')
except UnicodeEncodeError:
    print("ASCIIエンコードされた文字列ではありません")
else:
    print("ASCIIエンコードされた文字列です")

出力結果

ASCIIエンコードされた文字列ではありません

この方法なら、C言語レベルで高速に処理されるため、大きな文字列でもパフォーマンスへの影響を抑えられます。

関数としてまとめる場合

再利用しやすいように、例外処理を関数化すると次のようになります。

def is_ascii(s):
    try:
        s.encode('ascii')
        return True
    except UnicodeEncodeError:
        return False

print(is_ascii('ӓmsterdӓm'))  # False
print(is_ascii('Amsterdam'))  # True

まとめ

  • all() + ord():直感的で理解しやすいが、長い文字列では低速。
  • encode('ascii') + 例外処理:高速で実用的。実務ではこちらが推奨される。

用途や文字列のサイズに応じて、適切な方法を選択するとよいでしょう。

  1. Pythonで文字列が英数字のみで構成されているか判定する方法【isalnum()と正規表現】

    Pythonでは、文字列がアルファベットや数字だけで構成されているかどうかを簡単にチェックできます。主な方法は2つあります。1つは文字列クラスに組み込まれている isalnum() メソッドを使う方法、もう1つは正規表現(regex)を使う方法です。 1. isalnum() メソッドを使う方法 Pythonの文字列クラスには isalnum() というメソッドが用意されています。このメソッドを文字列に対して呼び出すと、その文字列が英数字(アルファベットと数字)のみで構成されている場合に True を、それ以外の場合に False を返します。 使用例:英数字のみの文字列 print(12

  2. Pythonで部分文字列が文字列に含まれているか確認する方法(in演算子とfindメソッド)

    Pythonでは、ある文字列が別の文字列の部分文字列(サブストリング)として含まれているかどうかを簡単に確認できます。最も基本的な方法は、in 演算子を使うことです。in 演算子を使った判定方法in 演算子は、左辺の文字列が右辺の文字列に含まれている場合に True を、含まれていない場合に False を返します。以下はその使用例です。print(ello in hello world)実行結果:Trueこのように、ello は hello world の中に含まれているため、True が出力されます。find() メソッドで位置(インデックス)を取得する部分文字列が含まれているかどうかに加