Pythonで文字列を比較する方法:完全一致・部分一致・大小関係の判定
完全一致の比較
基本的な等価比較
str1 = "Python"
str2 = "Python"
str3 = "python"
print(str1 == str2) # True
print(str1 == str3) # False(大文字小文字が異なる)
print(str1 != str3) # True
大文字小文字を無視した比較
str1 = "Python"
str2 = "PYTHON"
# 小文字に変換して比較
print(str1.lower() == str2.lower()) # True
# 大文字に変換して比較
print(str1.upper() == str2.upper()) # True
None値との比較
text = "Hello"
none_value = None
print(text == none_value) # False
print(text is none_value) # False
print(none_value is None) # True
部分一致の比較
in演算子による部分一致
text = "Python Programming"
print("Python" in text) # True
print("Java" in text) # False
print("python" in text) # False(大文字小文字が異なる)
startswith()とendswith()
filename = "script.py"
print(filename.startswith("script")) # True
print(filename.endswith(".py")) # True
print(filename.endswith(".txt")) # False
複数のパターンをチェック
text = "Hello, World!"
prefixes = ("Hello", "Hi", "Hey")
suffixes = ("World!", "Python!", "Java!")
print(text.startswith(prefixes)) # True
print(text.endswith(suffixes)) # True
大小関係の比較
辞書式順序での比較
print("apple" < "banana") # True
print("apple" > "Apple") # True(小文字 > 大文字)
print("123" < "45") # True(文字列として比較)
数値文字列の比較
# 文字列として比較(辞書順)
print("10" < "2") # True("1" < "2")
# 数値として比較
print(int("10") < int("2")) # False
日本語文字列の比較
print("あ" < "か") # True
print("ひらがな" < "カタカナ") # True(ひらがな < カタカナ)
文字列長による比較
def compare_by_length(str1, str2):
len1, len2 = len(str1), len(str2)
if len1 == len2:
return "同じ長さ"
elif len1 > len2:
return f"{str1} の方が長い"
else:
return f"{str2} の方が長い"
print(compare_by_length("Python", "Java")) # Python の方が長い
正規表現による比較
パターンマッチング
import re
def matches_pattern(text, pattern):
return bool(re.match(pattern, text))
# 郵便番号のパターン
postal_pattern = r'^\d{3}-\d{4}$'
print(matches_pattern("123-4567", postal_pattern)) # True
print(matches_pattern("12-3456", postal_pattern)) # False
複雑なパターン比較
import re
def validate_email(email):
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
emails = ["test@example.com", "invalid-email", "user@site.org"]
for email in emails:
print(f"{email}: {validate_email(email)}")
類似度による比較
編集距離(レーベンシュタイン距離)
def levenshtein_distance(s1, s2):
if len(s1) < len(s2):
return levenshtein_distance(s2, s1)
if len(s2) == 0:
return len(s1)
previous_row = range(len(s2) + 1)
for i, c1 in enumerate(s1):
current_row = [i + 1]
for j, c2 in enumerate(s2):
insertions = previous_row[j + 1] + 1
deletions = current_row[j] + 1
substitutions = previous_row[j] + (c1 != c2)
current_row.append(min(insertions, deletions, substitutions))
previous_row = current_row
return previous_row[-1]
print(levenshtein_distance("kitten", "sitting")) # 3
簡易類似度計算
def simple_similarity(s1, s2):
s1, s2 = s1.lower(), s2.lower()
longer = s1 if len(s1) >= len(s2) else s2
shorter = s2 if len(s1) >= len(s2) else s1
if len(longer) == 0:
return 1.0
return (len(longer) - levenshtein_distance(longer, shorter)) / len(longer)
print(simple_similarity("Python", "Pyhton")) # 0.83...
実用的な活用例
パスワードの強度チェック
import re
def check_password_strength(password):
checks = {
'長さ8文字以上': len(password) >= 8,
'大文字を含む': bool(re.search(r'[A-Z]', password)),
'小文字を含む': bool(re.search(r'[a-z]', password)),
'数字を含む': bool(re.search(r'\d', password)),
'特殊文字を含む': bool(re.search(r'[!@#$%^&*(),.?":{}|<>]', password))
}
passed = sum(checks.values())
if passed >= 4:
return "強い"
elif passed >= 3:
return "普通"
else:
return "弱い"
passwords = ["password", "Password123", "StrongP@ss1"]
for pwd in passwords:
print(f"{pwd}: {check_password_strength(pwd)}")
ファイル名のソート
import re
def natural_sort_key(text):
"""自然順序でのソート用キー生成"""
def convert(element):
return int(element) if element.isdigit() else element.lower()
return [convert(c) for c in re.split(r'(\d+)', text)]
files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"]
print("通常のソート:", sorted(files))
print("自然順序ソート:", sorted(files, key=natural_sort_key))
重複文字列の検出
def find_duplicates(strings, ignore_case=True):
seen = set()
duplicates = set()
for s in strings:
normalized = s.lower() if ignore_case else s
if normalized in seen:
duplicates.add(s)
else:
seen.add(normalized)
return list(duplicates)
text_list = ["Python", "Java", "python", "C++", "java"]
dupes = find_duplicates(text_list)
print("重複:", dupes) # ['python', 'java']
バージョン番号の比較
def compare_versions(v1, v2):
def version_key(version):
return [int(x) for x in version.split('.')]
key1, key2 = version_key(v1), version_key(v2)
if key1 < key2:
return f"{v1} < {v2}"
elif key1 > key2:
return f"{v1} > {v2}"
else:
return f"{v1} == {v2}"
versions = [("1.0.0", "1.0.1"), ("2.1.0", "2.0.9"), ("1.2.3", "1.2.3")]
for v1, v2 in versions:
print(compare_versions(v1, v2))
カスタム比較関数
from functools import cmp_to_key
def custom_compare(s1, s2):
"""長さ優先、次に辞書順で比較"""
if len(s1) != len(s2):
return len(s1) - len(s2)
return -1 if s1 < s2 else (1 if s1 > s2 else 0)
words = ["cat", "elephant", "dog", "bird"]
sorted_words = sorted(words, key=cmp_to_key(custom_compare))
print(sorted_words) # ['cat', 'dog', 'bird', 'elephant']
パフォーマンス比較
import time
def benchmark_comparison():
strings = ["Python"] * 100000
target = "Python"
# == 演算子
start = time.time()
for s in strings:
result = s == target
time1 = time.time() - start
# is 演算子(同一オブジェクト)
start = time.time()
for s in strings:
result = s is target
time2 = time.time() - start
print(f"== 演算子: {time1:.6f}秒")
print(f"is 演算子: {time2:.6f}秒")
benchmark_comparison()
まとめ
文字列比較の方法を適切に選択することで、効率的で正確な処理が可能になります:
- 完全一致:
==/!=演算子 - 部分一致:
in演算子、startswith()/endswith() - 大小関係:比較演算子(
<,>,<=,>=) - パターンマッチ:正規表現
- 類似度:編集距離やカスタム関数
用途に応じて最適な比較方法を選択することが重要です。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座
