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爆速講座