Regex peut-il gérer les parenthèses imbriquées ? Explorer les limites et les solutions de pyparsing.

DDD
Libérer: 2024-11-01 00:41:28
original
332 Les gens l'ont consulté

Can Regex Handle Nested Parentheses? Exploring Limitations and pyparsing Solutions.

Correspondance de parenthèses imbriquées en Python : limitations des expressions régulières et solutions alternatives

La correspondance de parenthèses imbriquées dans des chaînes peut être une tâche difficile, en particulier lors de l'utilisation d'expressions régulières (regex). Considérez le code Python suivant :

<code class="python">import re

p = re.compile('\(.+\)')
str = '(((1+0)+1)+1)'
print(p.findall(str))</code>
Copier après la connexion

Ce code tente de faire correspondre toutes les chaînes de type expression mathématique dans la variable str à l'aide d'un seul modèle d'expression régulière. Cependant, il ne correspond qu'à l'expression entière dans son ensemble, même si l'objectif est d'identifier les parenthèses imbriquées individuelles.

Pourquoi Regex échoue

Les modèles Regex sont limités dans leur capacité à gérer les constructions imbriquées efficacement. L'expression (. ) correspond à n'importe quelle chaîne entre parenthèses, mais elle ne peut pas faire la distinction entre les différents niveaux d'imbrication. En conséquence, il regroupe tout ce qui se trouve dans les parenthèses les plus extérieures et ignore les parenthèses intérieures.

Une solution complète utilisant pyparsing

Pour surmonter les limites des regex, nous pouvons exploiter une bibliothèque plus avancée appelée pyparsing , qui fournit un analyseur spécialisé pour gérer les modèles de chaînes complexes. Voici un exemple utilisant pyparsing :

<code class="python">import pyparsing

thecontent = pyparsing.Word(pyparsing.alphanums) | '+' | '-'
parens = pyparsing.nestedExpr('(', ')', content=thecontent)</code>
Copier après la connexion

Ce code définit deux éléments : le contenu, qui représente des caractères individuels ou des opérateurs arithmétiques, et les parenthèses, qui définissent la structure des parenthèses imbriquées.

Utilisation pratique

Montrons cette solution avec un exemple :

<code class="python">res = parens.parseString("((12 + 2) + 3)")
print(res.asList())</code>
Copier après la connexion

Sortie :

[[['12', '+', '2'], '+', '3']]
Copier après la connexion

Avantages clés

L'utilisation de pyparsing pour la correspondance des parenthèses imbriquées offre plusieurs avantages sur regex :

  • Flexibilité : pyparsing permet des règles de correspondance de modèles beaucoup plus complexes et complexes.
  • Gestion de l'imbrication : Il considère explicitement niveaux d'imbrication et capture efficacement les structures internes.
  • Personnalisation : pyparsing vous permet d'adapter les règles de correspondance à vos besoins spécifiques.

Conclusion

Bien que les expressions régulières puissent être utiles pour une simple correspondance de chaînes, elles ont du mal à gérer les constructions imbriquées comme les parenthèses. Pour de tels scénarios, les bibliothèques d'analyse spécialisées telles que pyparsing offrent une alternative robuste et flexible, garantissant des résultats de correspondance précis et significatifs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!