Pythonで文字列に英字と数字がそれぞれ1つ以上含まれているか判定する方法
Pythonである文字列に「少なくとも1つの英字」と「少なくとも1つの数字」の両方が含まれているかどうかを判定したい場面は、パスワードのバリデーションなどでよくあります。最も手軽な方法は正規表現(regular expressions)を使うことです。re.match(regex, string)を利用すれば、指定した文字列に英字と数字が両方存在するかを一度にチェックできます。
正規表現を使った判定方法
以下の例では、先読み(lookahead)と呼ばれる?=構文を使って、文字列中に英字と数字がそれぞれ1つ以上あることを確認しています。
import re
print(bool(re.match('^(?=.*[0-9])(?=.*[a-zA-Z])', 'hasAlphanum123')))
print(bool(re.match('^(?=.*[0-9])(?=.*[a-zA-Z])', 'some string')))実行結果
True False
先読み(lookahead)とは?
正規表現における?=は先読み(lookahead)を呼び出すための構文です。先読みは、現在の位置から文字列の前方を見渡して、指定したパターンにマッチする部分が存在するかどうかを確認します。この例では、(?=.*[0-9])が「数字がどこかに1つ以上あること」、(?=.*[a-zA-Z])が「英字がどこかに1つ以上あること」をそれぞれ検証しています。先読みについてさらに詳しく知りたい方は、rexegg.comの解説ページが参考になります。
forループとフラグ変数を使った判定方法
正規表現を使わずに、シンプルなforループと2つのフラグ変数を組み合わせる方法もあります。各文字に対してisalpha()メソッドで英字かどうか、isdigit()メソッドで数字かどうかを順番にチェックし、最後に両方のフラグが立っているかを返します。
def validate_string(s):
letter_flag = False
number_flag = False
for i in s:
if i.isalpha():
letter_flag = True
if i.isdigit():
number_flag = True
return letter_flag and number_flag
print(validate_string('hasAlphanum23'))
print(validate_string('some string'))実行結果
このコードを実行すると、以下の出力が得られます。
True False
どちらの方法を選ぶべきか
- 正規表現方式: 条件を1行でまとめて記述でき、より複雑なルール(特殊文字の必須化や文字数制限など)への拡張も容易です。
- ループ+フラグ方式: コードの意図が直感的に分かりやすく、正規表現に不慣れなチームでも保守しやすいのが特徴です。
用途や可読性の要件に応じて、適切な方法を選択してください。
-
Pythonで与えられた数値がフィボナッチ数かどうかを判定する方法
本記事では、与えられた数値がフィボナッチ数であるかどうかを判定する問題の解決策について解説します。 問題の定義 ある数値 n が与えられたとき、その数値がフィボナッチ数であるかどうかを判定します。 第 n 項のフィボナッチ数は、直前の2つのフィボナッチ数の和として定義されることは広く知られています。しかし、フィボナッチ数列には漸化式以外にも興味深い数学的性質があります。 フィボナッチ数の判定条件 ある数値 n がフィボナッチ数であるのは、「5×n² + 4」または「5×n² − 4」のいずれかが完全平方数であるとき、かつそのときに限る この性質を利用すれば、フィボナッチ数列を実際に生成しなくて
-
Pythonで文字列が指定したサフィックス(接尾辞)リストのいずれかで終わるかどうかを確認する方法
endswith()メソッドを使う方法 Pythonの文字列クラスには、endswith()メソッドが用意されています。このメソッドは、検索したい文字列のタプルを受け取り、文字列オブジェクトに対して呼び出します。以下のように使用できます。 string = core java print(string.endswith((txt, xml, java, orld))) 実行結果 True タプル内のいずれかのサフィックスで文字列が終わっていればTrueが返され、どれにも該当しなければFalseが返されます。シンプルな判定であれば、この方法が最も可読性が高くおすすめです。 正規表現(re.sea