Python String Parsing pour débutants et experts

Python offre une multitude de possibilités pour travailler avec des chaînes de caractères (strings). Dans ce billet de blog, nous allons tout d'abord présenter les bases de l'analyse syntaxique de chaînes de caractères dans Python et préciser la différence entre l'indexation de chaînes et la séquence de chaînes.

Indexation des chaînes de caractères

En Python, un Chaîne une séquence de caractères. Ces caractères sont accessibles par le biais d'un index, qui peut être utilisé à 0 commence. Vous pouvez ainsi accéder au premier, au deuxième et au troisième caractère d'une chaîne de caractères :

text = "Python"
print(texte[0]) # Affiche 'P'.
print(texte[1]) # Émet 'y'.
print(texte[2]) # Émet 't'.

Vous pouvez également utiliser des index négatifs pour accéder aux caractères à partir de la fin de la chaîne de caractères :

print(texte[-1]) # Renvoie 'n'.
print(texte[-2]) # Renvoie 'o'.
print(texte[-3]) # Émet 'h'.

Séquence de chaînes

Une séquence de chaînes est une partie d'une chaîne de caractères indiquée par un index de début et de fin. En Python, vous pouvez utiliser ce que l'on appelle la syntaxe de découpage pour accéder à des parties d'une chaîne de caractères :

pythonCopy codetext = "Python"
print(texte[0:3]) # Retourne 'Pyt'.
print(text[1:4]) # Donne 'yth' en sortie
print(text[:2]) # Donne 'Py' (sans index initial, il correspond à l'index 0)
print(text[3 :]) # Renvoie 'hon' (sans index de fin, il correspond à l'index + 1)

La syntaxe de découpage fonctionne également avec des indices négatifs :

print(texte[-3:-1]) # Donne 'ho' en sortie
print(texte[:-2]) # Renvoie 'Pyth'.

Pour résumer les différences entre l'indexation de chaînes et la séquence de chaînes : L'indexation de chaînes se réfère à l'accès à un seul caractère dans une chaîne de caractères, tandis que la séquence de chaînes permet d'accéder à une partie de la chaîne de caractères.

Un cas d'utilisation de la méthode split en Python : les numéros de version et les hashs de commit

Dans de nombreuses situations, par exemple lorsque nous travaillons sur des projets logiciels, nous devons souvent extraire des informations de chaînes de caractères combinées. Prenons l'exemple d'une chaîne de caractères qui contient un numéro de version et un hachage de commit : "2.7.0_bf4fda703454". Pour séparer ces informations, nous pouvons utiliser split()-en Python.

version_hash = "2.7.0_bf4fda703454".
version_hash_list = version_hash.split("_")

Le résultat est une liste de chaînes de caractères qui se présente comme suit :

['2.7.0', 'bf4fda703454']

Ici, la chaîne de caractères est séparée à chaque trait de soulignement. Si vous souhaitez que la séparation se fasse uniquement après le premier trait de soulignement, vous pouvez utiliser la méthode split() avec le paramètre optionnel 1 utiliser :

version_hash.split("_", 1)

Si vous êtes sûr que la chaîne de caractères contient un trait de soulignement, vous pouvez même déballer les parties gauche et droite dans des variables séparées :

lhs, rhs = version_hash.split("_", 1)
print(lhs) # Renvoie '2.7.0'.
print(rhs) # Retourne 'bf4fda703454'.

Une alternative à la split()-L'utilisation de la méthode partition(). Son utilisation est similaire à celle de l'exemple précédent, sauf qu'elle renvoie trois composants au lieu de deux. Le principal avantage de cette méthode est qu'elle n'échoue pas si la chaîne de caractères ne contient pas le séparateur.

En général, la split()-est un moyen pratique de diviser et de traiter des informations combinées dans Python. Dans notre exemple, nous avons ainsi pu séparer facilement le numéro de version et le hash de commit.

Analyse syntaxique de chaînes avec expressions régulières - Regex

décomposer du texte en Python à l'aide de groupes de regex nommés et évaluer les avantages et les inconvénients par rapport aux fonctions traditionnelles telles que l'indexation par chaînes de caractères Python, le séquençage ou la méthode split

Si nous avons des chaînes de caractères complexes qui doivent être décomposées en raison de motifs ou d'une ponctuation difficile, les expressions régulières peuvent nous aider à reconnaître et à décomposer ces motifs.

Voici un exemple de code pour l'analyse syntaxique de chaînes avec des groupes de règles nommés en Python :

import re
# Exemple de texte
text = "Max Mustermann, Âge : 30 ans, Ville : Berlin"
# Expression régulière avec groupes nommés
pattern_text = r'(?P[A-Za-zäöüÄÖß\ns]+),\s+âge:\s+(?P\d+)\s+années,\s+ville:\s+(?P[A-Za-zäöüÄÖß\s]+)'
# Compilation de l'expression régulière
pattern = re.compile(texte_pattern)
# Recherche de correspondances dans le texte
match = pattern.match(texte)
# Vérifier si une correspondance a été trouvée
if match :
    # Extraire les groupes nommés
    name = match.group('name')
    age = match.group('age')
    city = match.group('city')
    # Sortie des informations extraites
    print(f "Nom : {nom}")
    print(f "Âge : {age}")
    print(f "Ville : {city}")
else :
    print("Aucune correspondance trouvée.")

Dans cet exemple, nous avons un exemple de texte contenant le nom d'une personne, son âge et sa ville. Nous utilisons une expression régulière avec des groupes nommés pour extraire les informations pertinentes du texte. Les groupes sont nommés comme suit :

  • nom: pour le nom de la personne
  • agepour l'âge de la personne
  • citypour la ville dans laquelle la personne vit

Une fois l'expression régulière compilée, nous recherchons les correspondances dans le texte. Si une correspondance est trouvée, nous extrayons les groupes nommés et affichons les informations extraites.

Avantages :

  1. Flexibilité : les expressions régulières offrent une grande flexibilité dans l'analyse de texte et peuvent reconnaître des modèles complexes.
  2. Compact : les expressions régulières sont souvent plus courtes et plus concises que les méthodes traditionnelles.
  3. Les groupes nommés : Les groupes nommés nous permettent d'identifier et d'extraire facilement des parties du motif.

Inconvénients :

  1. Courbe d'apprentissage : les expressions régulières ont une courbe d'apprentissage plus raide et sont souvent plus difficiles à lire et à comprendre que les méthodes traditionnelles.
  2. Application limitée : les expressions régulières ne sont pas adaptées aux documents profondément imbriqués tels que HTML, XML ou JSON.

Indexation par chaîne de caractères Python, séquençage ou méthode de fractionnement : les fonctions traditionnelles telles que l'indexation par chaîne de caractères Python, le séquençage ou la méthode de fractionnement sont bien adaptées aux tâches d'analyse de texte simples, pour lesquelles la structure de la chaîne de caractères est claire et simple.

Avantages :

  1. Simplicité : les méthodes traditionnelles sont faciles à comprendre et à mettre en œuvre.
  2. Lisibilité : le code est plus facile à lire et à comprendre pour les développeurs qui connaissent Python.

Inconvénients :

  1. Flexibilité limitée : ces méthodes offrent moins de flexibilité pour l'analyse de modèles de texte complexes.
  2. Un code plus long : Le code peut devenir plus long et plus confus si l'on essaie de reconnaître et de décomposer des modèles complexes.

Automatiser Regex en Python

Dans cet exemple, nous montrons comment utiliser le SDK Konfuzio pour automatiser la création de regex. Nous utilisons le SDK pour créer un tokenizer de regex personnalisé pour l'étiquette "ContractDate" à créer. Pour plus d'informations, voir le documentation technique et dans un plus d'articles de blog à trouver.

from konfuzio_sdk.data import Project
from konfuzio_sdk.tokenizer.regex import RegexTokenizer
from konfuzio_sdk.tokenizer.base import ListTokenizer
# Remplacez YOUR_PROJECT_ID et YOUR_CATEGORY_ID par les identifiants correspondants de votre projet et de votre catégorie.
my_project = Project(id_=YOUR_PROJECT_ID)
category = my_project.get_category_by_id(id_=YOUR_CATEGORY_ID)
tokenizer = ListTokenizer(tokenizers=[])
label = my_project.get_label_by_name("ContractDate")
# Trouver les expressions regex associées aux occurrences du label "ContractDate" correspondre
for regex dans label.find_regex(category=category) :
    regex_tokenizer = RegexTokenizer(regex=regex)
    tokenizer.tokenizers.append(regex_tokenizer)
# Utiliser le tokenizer Regex créé pour créer des annotations pour chaque chaîne correspondante dans un document.
# Remplacer YOUR_DOCUMENT_ID par l'ID correspondant de votre document.
document = my_project.get_document_by_id(YOUR_DOCUMENT_ID)
tokenizer.tokenize(document)

Dans cet extrait de code :

  1. Importons les classes et les fonctions nécessaires depuis le SDK Konfuzio.
  2. Créons un Projet-en indiquant l'identifiant du projet.
  3. Recevons-nous un Catégorie-en indiquant l'identifiant de la catégorie.
  4. Créeons un ListTokenizer.
  5. Recevons-nous le Label-pour l'étiquette "ContractDate„.
  6. Recherchons les expressions regex qui sont associées à des occurrences de l'étiquette "ContractDate"dans la catégorie des données d'entraînement.
  7. Ajoutons chaque expression regex trouvée en tant que RegexTokenizer le site ListTokenizer s'ajoutent.
  8. Utilisons le Regex Tokenizer que nous avons créé pour créer des annotations pour chaque chaîne de caractères correspondante dans un document. Pour ce faire, nous indiquons l'identifiant du document et appelons la commande tokenize()-du Tokenizer.

Une fois le tokenizer créé, vous pouvez l'utiliser pour créer automatiquement des expressions regex pour l'étiquette "ContractDateVous pouvez également trouver des "informations" dans vos documents et créer des annotations pour ces derniers.

"
"
Avatar de Florian Zyprian

Derniers articles