Comment filtrer les caractères non alphanumériques des chaînes de caractères Python

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

En programmation Python, manipuler les chaînes de caractères est une compétence fondamentale. Souvent, vous devez nettoyer des données textuelles en supprimant les caractères spéciaux, les signes de ponctuation ou autres caractères non alphanumériques. Ce processus est essentiel pour diverses applications telles que l'analyse de données, le traitement du langage naturel et le développement web.

Ce tutoriel vous guide à travers différentes méthodes pour filtrer les caractères non alphanumériques des chaînes de caractères Python. À la fin, vous serez en mesure de transformer un texte désordonné en données propres et structurées, plus faciles à traiter dans vos applications Python.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python/BasicConceptsGroup -.-> python/strings("Strings") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/FileHandlingGroup -.-> python/file_reading_writing("Reading and Writing Files") python/AdvancedTopicsGroup -.-> python/regular_expressions("Regular Expressions") subgraph Lab Skills python/strings -.-> lab-415420{{"Comment filtrer les caractères non alphanumériques des chaînes de caractères Python"}} python/build_in_functions -.-> lab-415420{{"Comment filtrer les caractères non alphanumériques des chaînes de caractères Python"}} python/file_reading_writing -.-> lab-415420{{"Comment filtrer les caractères non alphanumériques des chaînes de caractères Python"}} python/regular_expressions -.-> lab-415420{{"Comment filtrer les caractères non alphanumériques des chaînes de caractères Python"}} end

Bases des chaînes de caractères Python et caractères alphanumériques

Avant de plonger dans le filtrage des caractères non alphanumériques, comprenons ce que sont les chaînes de caractères et les caractères alphanumériques en Python.

Qu'est-ce qu'une chaîne de caractères Python ?

Les chaînes de caractères en Python sont des séquences de caractères encadrées par des guillemets. Vous pouvez utiliser des guillemets simples ('), doubles ("), ou triples (''' ou """) pour définir des chaînes de caractères.

Créons un nouveau fichier Python pour expérimenter avec les chaînes de caractères. Dans le WebIDE, créez un nouveau fichier dans le répertoire /home/labex/project en cliquant sur l'icône "Nouveau fichier" dans le panneau de l'explorateur. Nommez le fichier string_basics.py.

Ajoutez le code suivant au fichier :

## Different ways to define strings in Python
string1 = 'Hello, World!'
string2 = "Python Programming"
string3 = '''This is a
multiline string.'''

## Display each string
print("String 1:", string1)
print("String 2:", string2)
print("String 3:", string3)

Pour exécuter ce fichier, ouvrez un terminal (s'il n'est pas déjà ouvert) et exécutez :

python3 /home/labex/project/string_basics.py

Vous devriez voir une sortie similaire à :

String 1: Hello, World!
String 2: Python Programming
String 3: This is a
multiline string.

Qu'est-ce qu'un caractère alphanumérique ?

Les caractères alphanumériques incluent :

  • Les lettres (A-Z, a-z)
  • Les chiffres (0-9)

Tous les autres caractères (comme les signes de ponctuation, les espaces, les symboles) sont considérés comme non alphanumériques.

Créons un autre fichier pour vérifier si un caractère est alphanumérique. Créez un nouveau fichier appelé alphanumeric_check.py avec le contenu suivant :

## Check if characters are alphanumeric
test_string = "Hello123!@#"

print("Testing each character in:", test_string)
print("Character | Alphanumeric?")
print("-" * 24)

for char in test_string:
    is_alnum = char.isalnum()
    print(f"{char:^9} | {is_alnum}")

## Check entire strings
examples = ["ABC123", "Hello!", "12345", "a b c"]
print("\nChecking entire strings:")
for ex in examples:
    print(f"{ex:10} | {ex.isalnum()}")

Exécutez ce fichier :

python3 /home/labex/project/alphanumeric_check.py

Vous devriez voir une sortie indiquant quels caractères sont alphanumériques et lesquels ne le sont pas :

Testing each character in: Hello123!@#
Character | Alphanumeric?
------------------------
    H     | True
    e     | True
    l     | True
    l     | True
    o     | True
    1     | True
    2     | True
    3     | True
    !     | False
    @     | False
    ##     | False

Checking entire strings:
ABC123     | True
Hello!     | False
12345      | True
a b c      | False

Comme vous pouvez le voir, la méthode isalnum() retourne True pour les lettres et les chiffres et False pour tous les autres caractères. Cela sera utile lorsque nous devrons identifier les caractères non alphanumériques.

Filtrage avec les méthodes de chaînes de caractères

Python propose plusieurs méthodes de chaînes de caractères intégrées qui peuvent nous aider à filtrer les caractères non alphanumériques. Dans cette étape, nous allons explorer ces méthodes et créer notre propre fonction de filtrage.

Utilisation de la compréhension de chaînes de caractères

Une approche courante pour filtrer les caractères consiste à utiliser la compréhension de chaînes de caractères. Créons un nouveau fichier appelé string_filter.py :

## Using string comprehension to filter non-alphanumeric characters

def filter_alphanumeric(text):
    ## Keep only alphanumeric characters
    filtered_text = ''.join(char for char in text if char.isalnum())
    return filtered_text

## Test the function with different examples
test_strings = [
    "Hello, World!",
    "Python 3.10 is amazing!",
    "Email: [email protected]",
    "Phone: (123) 456-7890"
]

print("Original vs Filtered:")
print("-" * 40)

for text in test_strings:
    filtered = filter_alphanumeric(text)
    print(f"Original: {text}")
    print(f"Filtered: {filtered}")
    print("-" * 40)

Exécutez ce fichier :

python3 /home/labex/project/string_filter.py

Vous devriez voir une sortie comme celle-ci :

Original vs Filtered:
----------------------------------------
Original: Hello, World!
Filtered: HelloWorld
----------------------------------------
Original: Python 3.10 is amazing!
Filtered: Python310isamazing
----------------------------------------
Original: Email: [email protected]
Filtered: Emailuserexamplecom
----------------------------------------
Original: Phone: (123) 456-7890
Filtered: Phone1234567890
----------------------------------------

La fonction filter_alphanumeric() parcourt chaque caractère de la chaîne de caractères et ne conserve que ceux qui passent le test isalnum().

Utilisation de la fonction filter()

La fonction intégrée filter() de Python offre une autre façon d'obtenir le même résultat. Ajoutons cette méthode à notre fichier :

## Add to the string_filter.py file

def filter_alphanumeric_using_filter(text):
    ## Using the built-in filter() function
    filtered_text = ''.join(filter(str.isalnum, text))
    return filtered_text

print("\nUsing the filter() function:")
print("-" * 40)

for text in test_strings:
    filtered = filter_alphanumeric_using_filter(text)
    print(f"Original: {text}")
    print(f"Filtered: {filtered}")
    print("-" * 40)

Ouvrez le fichier string_filter.py dans le WebIDE et ajoutez le code ci-dessus à la fin du fichier. Ensuite, exécutez-le à nouveau :

python3 /home/labex/project/string_filter.py

Vous verrez que les deux méthodes produisent les mêmes résultats.

Filtrage personnalisé

Parfois, vous pouvez souhaiter conserver certains caractères non alphanumériques tout en supprimant d'autres. Ajoutons une fonction qui nous permet de spécifier quels caractères supplémentaires conserver :

## Add to the string_filter.py file

def custom_filter(text, keep_chars=""):
    ## Keep alphanumeric characters and any characters specified in keep_chars
    filtered_text = ''.join(char for char in text if char.isalnum() or char in keep_chars)
    return filtered_text

print("\nCustom filtering (keeping spaces and @):")
print("-" * 40)

for text in test_strings:
    filtered = custom_filter(text, keep_chars=" @")
    print(f"Original: {text}")
    print(f"Filtered: {filtered}")
    print("-" * 40)

Ajoutez ce code à la fin de votre fichier string_filter.py et exécutez-le à nouveau :

python3 /home/labex/project/string_filter.py

Maintenant, vous verrez que les espaces et les symboles @ sont conservés dans les résultats filtrés, ce qui peut être utile lorsque vous devez conserver un certain formatage ou des caractères spéciaux.

Utilisation des expressions régulières pour le nettoyage de texte

Les expressions régulières (regex) offrent un moyen puissant d'identifier et de manipuler des motifs dans le texte. Le module re de Python propose des fonctions pour travailler avec les expressions régulières.

Introduction aux expressions régulières de base pour le filtrage de caractères

Créons un nouveau fichier appelé regex_filter.py :

## Using regular expressions to filter non-alphanumeric characters
import re

def filter_with_regex(text):
    ## Replace all non-alphanumeric characters with an empty string
    filtered_text = re.sub(r'[^a-zA-Z0-9]', '', text)
    return filtered_text

## Test the function with different examples
test_strings = [
    "Hello, World!",
    "Python 3.10 is amazing!",
    "Email: [email protected]",
    "Phone: (123) 456-7890"
]

print("Original vs Regex Filtered:")
print("-" * 40)

for text in test_strings:
    filtered = filter_with_regex(text)
    print(f"Original: {text}")
    print(f"Filtered: {filtered}")
    print("-" * 40)

Le motif regex [^a-zA-Z0-9] correspond à tout caractère qui n'est PAS une lettre majuscule, minuscule ou un chiffre. La fonction re.sub() remplace tous les caractères correspondants par une chaîne vide.

Exécutez le fichier :

python3 /home/labex/project/regex_filter.py

Vous devriez voir une sortie similaire à :

Original vs Regex Filtered:
----------------------------------------
Original: Hello, World!
Filtered: HelloWorld
----------------------------------------
Original: Python 3.10 is amazing!
Filtered: Python310isamazing
----------------------------------------
Original: Email: [email protected]
Filtered: Emailuserexamplecom
----------------------------------------
Original: Phone: (123) 456-7890
Filtered: Phone1234567890
----------------------------------------

Motifs personnalisés avec les expressions régulières

Les expressions régulières permettent des motifs et des remplacements plus complexes. Ajoutons une fonction qui permet des motifs personnalisés :

## Add to the regex_filter.py file

def custom_regex_filter(text, pattern=r'[^a-zA-Z0-9]', replacement=''):
    ## Replace characters matching the pattern with the replacement
    filtered_text = re.sub(pattern, replacement, text)
    return filtered_text

print("\nCustom regex filtering (keeping spaces and some punctuation):")
print("-" * 60)

## Keep alphanumeric chars, spaces, and @.
custom_pattern = r'[^a-zA-Z0-9\s@\.]'

for text in test_strings:
    filtered = custom_regex_filter(text, pattern=custom_pattern)
    print(f"Original: {text}")
    print(f"Filtered: {filtered}")
    print("-" * 60)

Le motif [^a-zA-Z0-9\s@\.] correspond à tout caractère qui n'est PAS un caractère alphanumérique, un espace blanc (\s), un symbole @ ou un point. Ajoutez ce code à votre fichier regex_filter.py et exécutez-le à nouveau :

python3 /home/labex/project/regex_filter.py

Identification des caractères non alphanumériques

Parfois, vous pouvez vouloir identifier quels caractères non alphanumériques sont présents dans une chaîne de caractères. Ajoutons une fonction pour identifier ces caractères :

## Add to the regex_filter.py file

def identify_non_alphanumeric(text):
    ## Find all non-alphanumeric characters in the text
    non_alphanumeric = re.findall(r'[^a-zA-Z0-9]', text)
    ## Return unique characters as a set
    return set(non_alphanumeric)

print("\nIdentifying non-alphanumeric characters:")
print("-" * 40)

for text in test_strings:
    characters = identify_non_alphanumeric(text)
    print(f"Text: {text}")
    print(f"Non-alphanumeric characters: {characters}")
    print("-" * 40)

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

python3 /home/labex/project/regex_filter.py

La sortie vous montrera quels caractères non alphanumériques sont présents dans chaque chaîne de caractères, ce qui peut être utile pour comprendre ce qui doit être filtré dans vos données.

Applications réelles de nettoyage de texte

Maintenant que nous avons appris différentes méthodes pour filtrer les caractères non alphanumériques, appliquons ces techniques à des scénarios du monde réel.

Nettoyage de l'entrée utilisateur

L'entrée utilisateur contient souvent des caractères inattendus qui doivent être nettoyés. Créons un fichier appelé text_cleaning_app.py pour démontrer cela :

## Text cleaning application for user input
import re

def clean_username(username):
    """Cleans a username by removing special characters and spaces"""
    return re.sub(r'[^a-zA-Z0-9_]', '', username)

def clean_search_query(query):
    """Preserves alphanumeric chars and spaces, replaces multiple spaces with one"""
    ## First, replace non-alphanumeric chars (except spaces) with empty string
    cleaned = re.sub(r'[^a-zA-Z0-9\s]', '', query)
    ## Then, replace multiple spaces with a single space
    cleaned = re.sub(r'\s+', ' ', cleaned)
    ## Finally, strip leading and trailing spaces
    return cleaned.strip()

## Simulate user input
usernames = [
    "john.doe",
    "user@example",
    "my username!",
    "admin_123"
]

search_queries = [
    "python   programming",
    "how to filter?!  special chars",
    "$ regex      examples $",
    "   string methods   "
]

## Clean and display usernames
print("Username Cleaning:")
print("-" * 40)
for username in usernames:
    cleaned = clean_username(username)
    print(f"Original: {username}")
    print(f"Cleaned:  {cleaned}")
    print("-" * 40)

## Clean and display search queries
print("\nSearch Query Cleaning:")
print("-" * 40)
for query in search_queries:
    cleaned = clean_search_query(query)
    print(f"Original: '{query}'")
    print(f"Cleaned:  '{cleaned}'")
    print("-" * 40)

Exécutez ce fichier :

python3 /home/labex/project/text_cleaning_app.py

Gestion des données de fichier

Créons un fichier texte d'exemple et nettoyons-le. Tout d'abord, créez un fichier appelé sample_data.txt avec le contenu suivant :

User1: [email protected] (Active: Yes)
User2: [email protected] (Active: No)
User3: admin#[email protected] (Active: Yes)
Notes: Users should change their passwords every 90 days!

Vous pouvez créer ce fichier à l'aide de l'éditeur WebIDE. Maintenant, créons un fichier appelé file_cleaner.py pour nettoyer ces données :

## File cleaning application
import re

def extract_emails(text):
    """Extract email addresses from text"""
    ## Simple regex for email extraction
    email_pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
    return re.findall(email_pattern, text)

def extract_usernames(text):
    """Extract the username part from email addresses"""
    emails = extract_emails(text)
    usernames = [email.split('@')[0] for email in emails]
    return usernames

def clean_usernames(usernames):
    """Clean usernames by removing non-alphanumeric characters"""
    return [re.sub(r'[^a-zA-Z0-9]', '', username) for username in usernames]

## Read the sample data file
try:
    with open('/home/labex/project/sample_data.txt', 'r') as file:
        data = file.read()
except FileNotFoundError:
    print("Error: sample_data.txt file not found!")
    exit(1)

## Process the data
print("File Cleaning Results:")
print("-" * 50)
print("Original data:")
print(data)
print("-" * 50)

## Extract emails
emails = extract_emails(data)
print(f"Extracted {len(emails)} email addresses:")
for email in emails:
    print(f"  - {email}")

## Extract and clean usernames
usernames = extract_usernames(data)
cleaned_usernames = clean_usernames(usernames)

print("\nUsername extraction and cleaning:")
for i, (original, cleaned) in enumerate(zip(usernames, cleaned_usernames)):
    print(f"  - User {i+1}: {original} → {cleaned}")

print("-" * 50)

Exécutez ce fichier :

python3 /home/labex/project/file_cleaner.py

Comparaison des performances

Différentes méthodes de filtrage peuvent avoir des caractéristiques de performance différentes. Créons un fichier appelé performance_test.py pour les comparer :

## Performance comparison of different filtering methods
import re
import time

def filter_with_loop(text):
    """Filter using a simple loop"""
    result = ""
    for char in text:
        if char.isalnum():
            result += char
    return result

def filter_with_comprehension(text):
    """Filter using list comprehension"""
    return ''.join(char for char in text if char.isalnum())

def filter_with_filter_function(text):
    """Filter using the built-in filter function"""
    return ''.join(filter(str.isalnum, text))

def filter_with_regex(text):
    """Filter using regular expressions"""
    return re.sub(r'[^a-zA-Z0-9]', '', text)

def filter_with_translate(text):
    """Filter using string.translate"""
    ## Create a translation table that maps all non-alphanumeric chars to None
    from string import ascii_letters, digits
    allowed = ascii_letters + digits
    translation_table = str.maketrans('', '', ''.join(c for c in map(chr, range(128)) if c not in allowed))
    return text.translate(translation_table)

## Generate test data (a string with a mix of alphanumeric and other characters)
test_data = "".join(chr(i) for i in range(33, 127)) * 1000  ## ASCII printable characters repeated

## Define the filtering methods to test
methods = [
    ("Simple Loop", filter_with_loop),
    ("List Comprehension", filter_with_comprehension),
    ("Filter Function", filter_with_filter_function),
    ("Regular Expression", filter_with_regex),
    ("String Translate", filter_with_translate)
]

print("Performance Comparison:")
print("-" * 60)
print(f"Test data length: {len(test_data)} characters")
print("-" * 60)
print(f"{'Method':<20} | {'Time (seconds)':<15} | {'Characters Removed':<20}")
print("-" * 60)

## Test each method
for name, func in methods:
    start_time = time.time()
    result = func(test_data)
    end_time = time.time()

    execution_time = end_time - start_time
    chars_removed = len(test_data) - len(result)

    print(f"{name:<20} | {execution_time:<15.6f} | {chars_removed:<20}")

print("-" * 60)

Exécutez ce fichier :

python3 /home/labex/project/performance_test.py

La sortie vous montrera quelle méthode est la plus efficace pour filtrer les caractères non alphanumériques, ce qui peut être important lors du traitement de grandes quantités de données textuelles.

Résumé

Dans ce laboratoire (lab), vous avez appris plusieurs méthodes pour filtrer les caractères non alphanumériques des chaînes de caractères Python :

  1. Méthodes de chaîne de caractères (String Methods) : Utilisation des méthodes intégrées de chaîne de caractères de Python telles que isalnum() pour vérifier et filtrer les caractères.
  2. Compréhension et filtrage (Comprehension and Filter) : Emploi de la compréhension de liste et de la fonction intégrée filter() pour créer des chaînes de caractères propres.
  3. Expressions régulières (Regular Expressions) : Utilisation du module re de Python pour une correspondance et un remplacement de motifs puissants.
  4. Applications réelles (Real - World Applications) : Application de ces techniques à des scénarios pratiques tels que le nettoyage de l'entrée utilisateur, le traitement des données de fichier et la comparaison des performances.

Ces techniques sont fondamentales pour les tâches de traitement de texte dans divers domaines, notamment :

  • Nettoyage des données dans l'analyse de données et l'apprentissage automatique
  • Traitement du langage naturel
  • Extraction de données et scraping web
  • Validation de l'entrée utilisateur dans les applications web

En maîtrisant ces méthodes, vous disposez désormais des compétences nécessaires pour transformer des données textuelles désordonnées en formats propres et structurés, plus faciles à analyser et à traiter dans vos applications Python.