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

Pythonで文字列に英字・数字・アンダースコア・ダッシュのみが含まれているか確認する方法

Pythonで文字列が英字・数字・アンダースコア(_)・ダッシュ(-)のみで構成されているかどうかを判定したい場合、正規表現を使うのが最も一般的で簡潔な方法です。パターン「^[A-Za-z0-9_-]*$」を利用することで、許可された文字以外が含まれていないかを簡単にチェックできます。

正規表現を使った方法

標準ライブラリのreモジュールにあるmatch()関数と、上記の正規表現パターンを組み合わせます。文字列全体がパターンに一致すればTrue、許可されていない文字が1つでも含まれていればFalseが返されます。

import re

print(bool(re.match("^[A-Za-z0-9_-]*$", 'aValidString123--__')))
print(bool(re.match("^[A-Za-z0-9_-]*$", 'inv@lid')))

実行結果

True
False

1行目の文字列は英字・数字・ダッシュ・アンダースコアのみで構成されているためTrueとなり、「@」という許可外の文字を含む2行目はFalseになります。

集合(セット)を使った方法

正規表現を使わずに、集合(set)を利用して判定することもできます。あらかじめ許可したい文字からなる集合を定義しておき、検証対象の文字列を集合に変換したものが、その部分集合になっているかをissubset()メソッドで確認します。

なお、元のコード例で使われている「from sets import Set」はPython 2専用の記述で、setsモジュールはPython 3では廃止されています。以下はPython 3に対応させた書き方です。

# Python 3の場合
allowed_chars = set('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-')
validation_string = 'inv@lid'

if set(validation_string).issubset(allowed_chars):
    print(True)
else:
    print(False)

実行結果

False

「inv@lid」には許可されていない「@」が含まれているため、Falseが出力されます。

補足:fullmatch()を使うとより安全

re.match()は文字列の先頭からの一致のみを調べるため、厳密には末尾の「$」が必要です。Python 3.4以降では、文字列全体との完全一致を判定するre.fullmatch()を使うと、より意図が明確で安全なコードになります。

import re

print(bool(re.fullmatch(r'[A-Za-z0-9_-]+', 'aValidString123--__')))  # True
print(bool(re.fullmatch(r'[A-Za-z0-9_-]+', 'inv@lid')))              # False

まとめ

  • 正規表現「^[A-Za-z0-9_-]*$」とre.match()(またはre.fullmatch())を使うのが最もシンプルな方法。
  • 正規表現を避けたい場合は、setとissubset()を組み合わせた判定も有効。
  • 空文字列を無効扱いしたい場合は、パターン内の「*」を「+」に変更すると良い。
  1. Pythonで文字列が英数字のみで構成されているか判定する方法【isalnum()と正規表現】

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

  2. Pythonで例外メッセージをキャプチャして出力する方法

    Pythonでは、発生した例外のメッセージをさまざまな方法でキャプチャし、出力することができます。以下に2つのコード例を示します。最初の例では、例外オブジェクトが持つ message 属性を使用しています。例1:message属性を使う方法try: a = 7/0 print float(a) except BaseException as e: print e.message出力integer division or modulo by zeroこのコードでは0による除算が行われたため ZeroDivisionError が発生し、そのメッセージ「integer di