Comment comparer deux chaînes de caractères Python pour l'égalité de manière insensible à la casse ?

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Lorsque vous travaillez avec des données textuelles en Python, vous avez souvent besoin de comparer des chaînes de caractères pour déterminer si elles contiennent les mêmes informations, indépendamment du fait que les lettres soient en majuscules ou en minuscules. Cela s'appelle une comparaison de chaînes de caractères insensible à la casse.

Dans ce laboratoire (lab), vous apprendrez différentes méthodes pour comparer l'égalité de deux chaînes de caractères Python tout en ignorant les différences de casse. Vous explorerez la comparaison de chaînes de caractères de base, diverses techniques de comparaison insensible à la casse et verrez comment appliquer ces compétences dans des scénarios du monde réel.

À la fin de ce laboratoire (lab), vous serez en mesure d'implémenter avec confiance des comparaisons de chaînes de caractères insensibles à la casse dans vos programmes Python, améliorant ainsi votre capacité à gérer efficacement les données textuelles.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/BasicConceptsGroup -.-> python/strings("Strings") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/AdvancedTopicsGroup -.-> python/regular_expressions("Regular Expressions") subgraph Lab Skills python/strings -.-> lab-395043{{"Comment comparer deux chaînes de caractères Python pour l'égalité de manière insensible à la casse ?"}} python/conditional_statements -.-> lab-395043{{"Comment comparer deux chaînes de caractères Python pour l'égalité de manière insensible à la casse ?"}} python/function_definition -.-> lab-395043{{"Comment comparer deux chaînes de caractères Python pour l'égalité de manière insensible à la casse ?"}} python/regular_expressions -.-> lab-395043{{"Comment comparer deux chaînes de caractères Python pour l'égalité de manière insensible à la casse ?"}} end

Comprendre la comparaison de chaînes de caractères en Python

Commençons par explorer le fonctionnement des comparaisons de chaînes de caractères en Python et pourquoi la sensibilité à la casse est importante.

Comparaison de chaînes de caractères par défaut

En Python, lorsque vous comparez deux chaînes de caractères à l'aide de l'opérateur d'égalité (==), la comparaison est sensible à la casse par défaut. Cela signifie que "Hello" et "hello" sont considérées comme des chaînes de caractères différentes.

Créons un nouveau fichier Python pour tester cela :

  1. Dans l'WebIDE, cliquez sur l'icône "Explorer" dans la barre latérale de gauche.
  2. Cliquez sur le bouton "New File" et nommez-le string_comparison.py.
  3. Ajoutez le code suivant au fichier :
## Basic string comparison
string1 = "Python"
string2 = "python"

## Compare the strings
result = string1 == string2

## Print the result
print(f"Is '{string1}' equal to '{string2}'? {result}")
string comparison
  1. Enregistrez le fichier en appuyant sur Ctrl+S ou en sélectionnant "File" > "Save" dans le menu.
  2. Exécutez le script en ouvrant un terminal (Terminal > New Terminal) et en tapant :
python3 string_comparison.py

Vous devriez voir la sortie suivante :

Is 'Python' equal to 'python'? False

La sortie affiche False car la comparaison est sensible à la casse, et "Python" avec un 'P' majuscule n'est pas le même que "python" avec un 'p' minuscule.

Pourquoi la comparaison insensible à la casse est utile

La comparaison insensible à la casse est utile dans de nombreux scénarios :

  • Validation de l'entrée utilisateur (les utilisateurs peuvent taper en n'importe quelle casse)
  • Recherche de texte (recherche de mots indépendamment de la casse)
  • Traitement du langage naturel (où la capitalisation peut varier)
  • Traitement d'URL, d'adresses e-mail ou de noms d'utilisateur (qui peuvent être insensibles à la casse)

Modifions notre script pour ajouter quelques exemples qui montrent quand la comparaison insensible à la casse est utile :

## Add these examples to string_comparison.py

## Example: User searching for content
user_search = "Python"
article_title = "Getting Started with python Programming"

## Case-sensitive comparison (might miss relevant content)
found_sensitive = user_search in article_title
print(f"Case-sensitive search found match: {found_sensitive}")

## What if we want to find matches regardless of case?
## We'll explore solutions in the next steps

Ajoutez ce code à votre fichier string_comparison.py et exécutez-le à nouveau :

python3 string_comparison.py

La sortie inclut maintenant :

Case-sensitive search found match: False

Cela montre un problème pratique : un utilisateur recherchant "Python" ne trouverait pas de contenu intitulé "python Programming" avec la comparaison sensible à la casse par défaut.

Dans l'étape suivante, nous apprendrons à effectuer des comparaisons insensibles à la casse pour résoudre ce problème.

Méthodes de comparaison de chaînes de caractères insensibles à la casse

Maintenant que vous comprenez pourquoi la comparaison insensible à la casse est importante, apprenons différentes méthodes pour l'effectuer en Python.

Méthode 1 : Utilisation de lower() ou upper()

L'approche la plus courante consiste à convertir les deux chaînes de caractères en la même casse avant de les comparer. Vous pouvez utiliser les méthodes lower() ou upper() à cet effet.

Créons un nouveau fichier pour tester ces méthodes :

  1. Dans l'WebIDE, créez un nouveau fichier et nommez-le case_insensitive.py.
  2. Ajoutez le code suivant :
## Case-insensitive comparison using lower()
string1 = "Python"
string2 = "python"

## Convert both strings to lowercase, then compare
result_lower = string1.lower() == string2.lower()
print(f"Using lower(): '{string1}' equals '{string2}'? {result_lower}")

## Convert both strings to uppercase, then compare
result_upper = string1.upper() == string2.upper()
print(f"Using upper(): '{string1}' equals '{string2}'? {result_upper}")
  1. Enregistrez le fichier et exécutez-le avec :
python3 case_insensitive.py

Vous devriez voir :

Using lower(): 'Python' equals 'python'? True
Using upper(): 'Python' equals 'python'? True

Les deux méthodes produisent le même résultat - elles confirment que les chaînes de caractères sont égales lorsque la casse est ignorée.

Méthode 2 : Utilisation de casefold()

La méthode casefold() est similaire à lower() mais offre un aplatissement de casse plus agressif qui fonctionne mieux pour certaines langues avec des règles de mappage de casse spéciales.

Ajoutez le code suivant à votre fichier case_insensitive.py :

## Case-insensitive comparison using casefold()
german_string1 = "Straße"  ## German word for "street"
german_string2 = "STRASSE" ## Uppercase version (note: ß becomes SS when uppercased)

## Using lower()
result_german_lower = german_string1.lower() == german_string2.lower()
print(f"Using lower() with '{german_string1}' and '{german_string2}': {result_german_lower}")

## Using casefold()
result_german_casefold = german_string1.casefold() == german_string2.casefold()
print(f"Using casefold() with '{german_string1}' and '{german_string2}': {result_german_casefold}")

Exécutez le script à nouveau :

python3 case_insensitive.py

Vous verrez :

Using lower() with 'Straße' and 'STRASSE': False
Using casefold() with 'Straße' and 'STRASSE': True

Cela démontre que casefold() gère mieux les mappages de caractères spéciaux que lower() dans certaines langues.

Méthode 3 : Utilisation d'expressions régulières

Pour des scénarios plus avancés, vous pouvez utiliser des expressions régulières avec le module re et le drapeau IGNORECASE :

Ajoutez le code suivant à votre fichier case_insensitive.py :

## Case-insensitive comparison using regular expressions
import re

text = "Python is a great programming language."
pattern1 = "python"

## Check if 'python' exists in the text (case-insensitive)
match = re.search(pattern1, text, re.IGNORECASE)
print(f"Found '{pattern1}' in text? {match is not None}")

## Case-insensitive equality check with regex
def regex_equal_ignore_case(str1, str2):
    return bool(re.match(f"^{re.escape(str1)}$", str2, re.IGNORECASE))

## Test the function
result_regex = regex_equal_ignore_case("Python", "python")
print(f"Using regex: 'Python' equals 'python'? {result_regex}")

Exécutez le script à nouveau :

python3 case_insensitive.py

Vous devriez voir :

Found 'python' in text? True
Using regex: 'Python' equals 'python'? True

Comparaison des méthodes

Récapitulons les méthodes que nous avons apprises :

  • lower()/upper() : Simple et couramment utilisée, fonctionne pour la plupart des textes en anglais
  • casefold() : Mieux adaptée pour les textes internationaux avec des règles de mappage de casse spéciales
  • Expressions régulières avec re.IGNORECASE : Puissante pour la correspondance de motifs et les cas complexes

Ajoutez ce récapitulatif à votre fichier case_insensitive.py sous forme de commentaire pour référence :

## Summary of case-insensitive comparison methods:
## 1. string1.lower() == string2.lower() - Simple, works for basic cases
## 2. string1.casefold() == string2.casefold() - Better for international text
## 3. re.match(pattern, string, re.IGNORECASE) - For pattern matching

Maintenant que vous comprenez les différentes méthodes, appliquons ces techniques à des scénarios pratiques dans l'étape suivante.

Création d'une fonction de recherche insensible à la casse

Maintenant que vous avez appris différentes méthodes de comparaison insensible à la casse, créons une fonction de recherche pratique qui peut trouver des mots dans un texte indépendamment de la casse.

Création d'une fonction de recherche

  1. Dans l'WebIDE, créez un nouveau fichier et nommez-le search_function.py.
  2. Ajoutez le code suivant pour implémenter une simple fonction de recherche insensible à la casse :
def search_text(query, text):
    """
    Search for a query in text, ignoring case.
    Returns a list of all matching positions.
    """
    ## Convert both to lowercase for case-insensitive comparison
    query_lower = query.lower()
    text_lower = text.lower()

    found_positions = []
    position = 0

    ## Find all occurrences
    while position < len(text_lower):
        position = text_lower.find(query_lower, position)
        if position == -1:  ## No more matches
            break
        found_positions.append(position)
        position += 1  ## Move to the next character

    return found_positions

## Example text
sample_text = """
Python is a programming language that lets you work quickly and integrate systems effectively.
python is easy to learn, powerful, and versatile.
Many developers love PYTHON for its simplicity and readability.
"""

## Test search
search_query = "python"
results = search_text(search_query, sample_text)

## Display results
if results:
    print(f"Found '{search_query}' at {len(results)} positions: {results}")

    ## Show each match in context
    print("\nMatches in context:")
    for pos in results:
        ## Get some context around the match (10 characters before and after)
        start = max(0, pos - 10)
        end = min(len(sample_text), pos + len(search_query) + 10)
        context = sample_text[start:end]

        ## Highlight the match by showing the original case from the text
        match_original_case = sample_text[pos:pos+len(search_query)]
        print(f"...{context.replace(match_original_case, f'[{match_original_case}]')}...")
else:
    print(f"No matches found for '{search_query}'")
  1. Enregistrez le fichier et exécutez-le avec :
python3 search_function.py

Vous devriez voir une sortie comme celle-ci :

Found 'python' at 3 positions: [1, 67, 132]

Matches in context:
...[Python] is a pro...
...ctively.
[python] is easy ...
...ers love [PYTHON] for its ...

Cela montre que notre fonction a trouvé "Python" à trois endroits, indépendamment de si elle était écrite comme "Python", "python" ou "PYTHON". La fonction montre également chaque correspondance dans son contexte d'origine, en préservant la capitalisation d'origine.

Amélioration de la fonction de recherche

Améliorons notre fonction pour la rendre plus utile en ajoutant l'option de compter les mots et de gérer les correspondances de mots entiers :

Ajoutez le code suivant à votre fichier search_function.py :

def count_word_occurrences(word, text, whole_word=False):
    """
    Count occurrences of a word in text, ignoring case.
    If whole_word=True, only count complete word matches.
    """
    word_lower = word.lower()
    text_lower = text.lower()

    if whole_word:
        ## Use word boundaries to match whole words only
        import re
        pattern = r'\b' + re.escape(word_lower) + r'\b'
        matches = re.findall(pattern, text_lower)
        return len(matches)
    else:
        ## Simple substring counting
        return text_lower.count(word_lower)

## Test the enhanced function
test_text = """
Python is great. I love python programming.
This python-script demonstrates case-insensitive searching.
The word "python" appears multiple times as a whole word and as part of other words.
"""

## Count all occurrences (including within words)
count_all = count_word_occurrences("python", test_text)
print(f"Total occurrences of 'python' (including within words): {count_all}")

## Count only whole word occurrences
count_whole = count_word_occurrences("python", test_text, whole_word=True)
print(f"Whole word occurrences of 'python': {count_whole}")

Exécutez le script à nouveau :

python3 search_function.py

Vous devriez maintenant voir une sortie supplémentaire :

Total occurrences of 'python' (including within words): 4
Whole word occurrences of 'python': 3

Cela montre que "python" apparaît 4 fois au total, mais seulement 3 fois comme mot entier (une occurrence est dans "python-script" qui n'est pas une correspondance de mot entier).

Test de différents scénarios

Ajoutons un autre test pour montrer comment nos fonctions gèrent différents types de texte :

## Add more test cases
test_cases = [
    ("Python programming is fun", "python", "Simple sentence with one occurrence"),
    ("Python, python, PYTHON!", "python", "Multiple occurrences with different cases"),
    ("No matches here", "python", "No matches"),
    ("Python-script and PythonProgram contain python", "python", "Mixed word boundaries")
]

print("\nTesting different scenarios:")
for text, search_word, description in test_cases:
    whole_matches = count_word_occurrences(search_word, text, whole_word=True)
    all_matches = count_word_occurrences(search_word, text)

    print(f"\nScenario: {description}")
    print(f"Text: '{text}'")
    print(f"  - Whole word matches: {whole_matches}")
    print(f"  - All matches: {all_matches}")

Ajoutez ce code et exécutez le script à nouveau :

python3 search_function.py

Vous verrez un détail de la façon dont la fonction gère différents scénarios de texte :

Testing different scenarios:

Scenario: Simple sentence with one occurrence
Text: 'Python programming is fun'
  - Whole word matches: 1
  - All matches: 1

Scenario: Multiple occurrences with different cases
Text: 'Python, python, PYTHON!'
  - Whole word matches: 3
  - All matches: 3

Scenario: No matches
Text: 'No matches here'
  - Whole word matches: 0
  - All matches: 0

Scenario: Mixed word boundaries
Text: 'Python-script and PythonProgram contain python'
  - Whole word matches: 1
  - All matches: 3

Cela démontre comment la comparaison insensible à la casse peut être utilisée dans une fonction de recherche du monde réel, avec des options pour gérer différentes exigences de recherche.

Dans l'étape suivante, nous appliquerons ces techniques pour créer une application pratique de validation d'entrée utilisateur.

Création d'une application de validation d'entrée utilisateur

Dans cette étape finale, nous allons créer une application pratique qui utilise la comparaison de chaînes de caractères insensible à la casse pour la validation des entrées utilisateur. C'est une exigence courante dans de nombreuses applications du monde réel.

Validateur de commandes simple

  1. Dans l'WebIDE, créez un nouveau fichier et nommez-le command_validator.py.
  2. Ajoutez le code suivant pour implémenter un validateur de commandes simple :
def validate_command(user_input, valid_commands):
    """
    Validate if the user input matches any of the valid commands,
    ignoring case differences.

    Returns the standardized command if valid, None otherwise.
    """
    ## Convert user input to lowercase for comparison
    user_input_lower = user_input.strip().lower()

    for cmd in valid_commands:
        if user_input_lower == cmd.lower():
            ## Return the standard casing of the command
            return cmd

    ## No match found
    return None

## List of valid commands with standard casing
VALID_COMMANDS = [
    "Help",
    "Exit",
    "List",
    "Save",
    "Delete"
]

## Test with various inputs
test_inputs = [
    "help",      ## lowercase
    "EXIT",      ## uppercase
    "List",      ## correct case
    "  save  ",  ## with extra spaces
    "delete",    ## lowercase
    "unknown",   ## invalid command
    "hlep"       ## typo
]

print("Command Validator Test:")
print("=" * 30)
print(f"Valid commands: {VALID_COMMANDS}")
print("=" * 30)

for cmd in test_inputs:
    result = validate_command(cmd, VALID_COMMANDS)
    if result:
        print(f"'{cmd}' is valid ✓ (standardized to '{result}')")
    else:
        print(f"'{cmd}' is invalid ✗")
  1. Enregistrez le fichier et exécutez-le avec :
python3 command_validator.py

Vous devriez voir une sortie comme celle-ci :

Command Validator Test:
==============================
Valid commands: ['Help', 'Exit', 'List', 'Save', 'Delete']
==============================
'help' is valid ✓ (standardized to 'Help')
'EXIT' is valid ✓ (standardized to 'Exit')
'List' is valid ✓ (standardized to 'List')
'  save  ' is valid ✓ (standardized to 'Save')
'delete' is valid ✓ (standardized to 'Delete')
'unknown' is invalid ✗
'hlep' is invalid ✗

Cela montre comment la comparaison insensible à la casse peut être utilisée pour valider les commandes utilisateur tout en maintenant un format de sortie standardisé.

Processeur de commandes interactif

Maintenant, créons une version interactive où les utilisateurs peuvent entrer directement des commandes :

  1. Créez un nouveau fichier nommé interactive_commands.py.
  2. Ajoutez le code suivant :
## Interactive command processor using case-insensitive validation

## Valid commands with descriptions
COMMANDS = {
    "Help": "Display available commands",
    "List": "List all items",
    "Add": "Add a new item",
    "Delete": "Delete an item",
    "Exit": "Exit the program"
}

def process_command(command):
    """Process a command entered by the user."""
    ## Normalize command (remove extra spaces, convert to standard case)
    normalized = None

    ## Check if command matches any valid command (case-insensitive)
    for valid_cmd in COMMANDS:
        if command.strip().lower() == valid_cmd.lower():
            normalized = valid_cmd
            break

    ## Process the command
    if normalized == "Help":
        print("\nAvailable commands:")
        for cmd, desc in COMMANDS.items():
            print(f"  {cmd} - {desc}")

    elif normalized == "List":
        print("\nListing all items:")
        print("  (This is where your actual items would be displayed)")

    elif normalized == "Add":
        print("\nAdding a new item:")
        print("  (In a real application, you would prompt for item details here)")

    elif normalized == "Delete":
        print("\nDeleting an item:")
        print("  (In a real application, you would prompt for which item to delete)")

    elif normalized == "Exit":
        print("\nExiting program. Goodbye!")
        return False

    else:
        print(f"\nUnknown command: '{command}'")
        print("Type 'help' to see available commands")

    return True

def main():
    """Main program loop."""
    print("=== Simple Command Processor ===")
    print("Type 'help' to see available commands.")
    print("Commands are case-insensitive, so 'help', 'HELP', and 'Help' all work the same.")

    running = True
    while running:
        user_input = input("\nEnter a command: ")
        running = process_command(user_input)

if __name__ == "__main__":
    main()
  1. Enregistrez le fichier et exécutez-le :
python3 interactive_commands.py

Vous verrez une invite interactive :

=== Simple Command Processor ===
Type 'help' to see available commands.
Commands are case-insensitive, so 'help', 'HELP', and 'Help' all work the same.

Enter a command:
  1. Essayez d'entrer diverses commandes avec différentes capitalisations :
    • help (en minuscules)
    • LIST (en majuscules)
    • Add (avec une casse mixte)
    • exit (pour quitter le programme)

Le programme traitera chaque commande correctement, quelle que soit la casse que vous utilisez.

Récapitulatif des techniques de validation d'entrée

Créons un autre fichier pour résumer les différentes techniques que nous avons apprises pour la validation d'entrée insensible à la casse :

  1. Créez un fichier nommé validation_techniques.py.
  2. Ajoutez le code suivant :
"""
Summary of Case-Insensitive Input Validation Techniques
"""

## Example data
valid_options = ["Yes", "No", "Maybe"]
user_responses = ["yes", "NO", "mAyBe", "unknown"]

print("Case-Insensitive Input Validation Techniques\n")

## Technique 1: Simple lowercase comparison
print("Technique 1: Simple lowercase comparison")
for response in user_responses:
    is_valid = response.lower() in [opt.lower() for opt in valid_options]
    print(f"  Is '{response}' valid? {is_valid}")

## Technique 2: Using a validation function
print("\nTechnique 2: Using a validation function")
def validate_input(user_input, valid_options):
    return any(user_input.lower() == opt.lower() for opt in valid_options)

for response in user_responses:
    is_valid = validate_input(response, valid_options)
    print(f"  Is '{response}' valid? {is_valid}")

## Technique 3: Mapping to standardized values
print("\nTechnique 3: Mapping to standardized values")
def standardize_input(user_input, valid_options):
    for opt in valid_options:
        if user_input.lower() == opt.lower():
            return opt
    return None

for response in user_responses:
    standard_form = standardize_input(response, valid_options)
    if standard_form:
        print(f"  '{response}' is valid and maps to '{standard_form}'")
    else:
        print(f"  '{response}' is invalid")

## Technique 4: Using dictionaries for case-insensitive lookup
print("\nTechnique 4: Using dictionaries for case-insensitive lookup")
## Create a case-insensitive lookup dictionary
lookup_dict = {opt.lower(): opt for opt in valid_options}

for response in user_responses:
    if response.lower() in lookup_dict:
        standard_form = lookup_dict[response.lower()]
        print(f"  '{response}' is valid and maps to '{standard_form}'")
    else:
        print(f"  '{response}' is invalid")
  1. Enregistrez le fichier et exécutez-le :
python3 validation_techniques.py

Vous verrez une comparaison de différentes techniques de validation :

Case-Insensitive Input Validation Techniques

Technique 1: Simple lowercase comparison
  Is 'yes' valid? True
  Is 'NO' valid? True
  Is 'mAyBe' valid? True
  Is 'unknown' valid? False

Technique 2: Using a validation function
  Is 'yes' valid? True
  Is 'NO' valid? True
  Is 'mAyBe' valid? True
  Is 'unknown' valid? False

Technique 3: Mapping to standardized values
  'yes' is valid and maps to 'Yes'
  'NO' is valid and maps to 'No'
  'mAyBe' is valid and maps to 'Maybe'
  'unknown' is invalid

Technique 4: Using dictionaries for case-insensitive lookup
  'yes' is valid and maps to 'Yes'
  'NO' is valid and maps to 'No'
  'mAyBe' is valid and maps to 'Maybe'
  'unknown' is invalid

Ce récapitulatif montre différentes approches pour implémenter la validation insensible à la casse, vous donnant des options pour choisir celle qui correspond le mieux à vos besoins spécifiques.

En terminant cette étape, vous avez appris à appliquer la comparaison de chaînes de caractères insensible à la casse dans un scénario pratique de validation d'entrée utilisateur.

Récapitulatif

Félicitations pour avoir terminé ce laboratoire sur la comparaison de chaînes de caractères insensible à la casse en Python. Voici ce que vous avez appris :

  1. Les bases de la comparaison de chaînes de caractères en Python et pourquoi la sensibilité à la casse est importante

  2. Plusieurs méthodes pour effectuer une comparaison de chaînes de caractères insensible à la casse :

    • Utilisation des méthodes lower() et upper()
    • Utilisation de la méthode casefold() pour le texte international
    • Utilisation d'expressions régulières avec re.IGNORECASE
  3. Comment construire des applications pratiques avec une comparaison insensible à la casse :

    • Création d'une fonction de recherche qui trouve du texte indépendamment de la casse
    • Mise en œuvre d'une validation d'entrée utilisateur qui fonctionne avec n'importe quelle capitalisation
    • Traitement des commandes de manière insensible à la casse

Ces compétences sont précieuses dans de nombreuses tâches de programmation du monde réel, depuis la construction d'interfaces utilisateur jusqu'au traitement de données textuelles. La comparaison de chaînes de caractères insensible à la casse est une technique fondamentale qui améliore l'expérience utilisateur et rend vos applications plus robustes et conviviales.

Au fur et à mesure que vous poursuivez votre parcours en Python, rappelez-vous que ces techniques peuvent être combinées avec d'autres méthodes de traitement de chaînes pour répondre à des exigences de traitement de texte de plus en plus complexes.