Maison >développement back-end >Tutoriel Python >Regex peut-il gérer les parenthèses imbriquées ? Explorer les limites et les solutions de pyparsing.

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

DDD
DDDoriginal
2024-11-01 00:41:28403parcourir

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>

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>

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>

Sortie :

[[['12', '+', '2'], '+', '3']]

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!

Déclaration:
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