0
votes

Expression régulière du premier bloc de numéro après un support d'ouverture. Répéter après la fermeture de la parenthèse

J'ai essayé de résoudre ce problème pendant un moment, mais je ne peux tout simplement pas le faire correctement.

J'aimerais que la chaîne suivante soit divisée afin que je reçois le premier bloc de nombres après le support d'ouverture. Si un autre support est ouvert avant que le précédent soit fermé, le bloc numérique suivant est invalide.

chaîne de test:

[(16908,76, (2585,0,0), (), (), ()), (18404.74, (), (), ()), (16823,66, (), (), ()), (0,0, (), (), ()), (16905.76, (), (), ())), (16910 76, (), (), (), ), (16909,76, (2585,0,0), (), ()), (16906,76, (1887,0,0), (), ()), (16911,76, (1886, 0,0), (), ()), (16907,76, (1887,0,0), (), ()), (19384,83, (), (), ()), (19898, 68, (), (), ()), (13965,63, (), (), ()), (11815 58, (), (), ()), (13340,63, (849, 0,0), (), ()), (19896,65, (1900,0,0), (), ()), (19910,65, (1900,0,0), (), () ), (17069,69, (), (), ()), (0,0, (), (), ())], []

Blocs de numéro valide: 16908, 18404, 16823, 16905, etc

Blocs de numéro non valides: 2585, 2585, 1887, etc

Les blocs valides doivent être affichés séparés par des virgules. Dans cet exemple, les chiffres ont tous cinq chiffres, mais cela peut varier de 0 à 8 chiffres. L'utilisation d'un tel (\ d {0,8}) ne me semble pas très adéquat.

Je ne suis absolument pas un professionnel de regex et serait heureux de tout type d'impulsion ou d'aide qui m'amène à mon objectif.

Merci d'avance.


6 commentaires

Mon sentiment est que c'est que c'est vraiment le travail d'un parseur formel , plutôt que d'essayer de trouver une sorte de regex. Pas mon bowvote cependant.


Je recommanderais d'essayer "ast.literal_eval" dessus et traiter le résultat.


Pourquoi 0 de (0,0, (), (), ()) un bloc de numéro valide?


Bon point @telmotrooper. C'est un nombre valide aussi.


Pourtant, vous avez (16908,76, (2585,0,0), (), (), ()) 16908 répertorié comme valide.


Quelque chose à quoi penser. Si un autre support est ouvert avant que le précédent soit fermé python re ne supporte pas le texte équilibré. Fondamentalement, ce que vous recherchez ne peut être accompli avec ce moteur. Il peut être avec le moteur Regex cependant.


3 Réponses :


0
votes

Cette regex veut que vous avez besoin de r '\ (((\ d {1,8}), \ d + (?:, \ (\ d *,? \ d * ,? \ d * \) {3} \) '?

Démo: https://regex101.com/r/oz0bde/1

Code Python: xxx

sortie: xxx


1 commentaires

Belle solution également et a le comportement exact que je cherchais. Merci beaucoup



0
votes

J'ai trouvé un moyen de le faire avec deux regexes: xxx

sortie est: xxx

est-ce le comportement que vous voulez?


1 commentaires

Plus que parfait! Parfois est moins plus :)



0
votes

Si vous n'avez pas besoin de vérifier la structure de la chaîne, vous pouvez correspondre à une expression régulière très simple qui reflète l'observation que les chaînes de chiffres d'intérêt sont les seules qui sont immédiatement précédées d'une parenthèse gauche.

^                : match beginning of string
\[               : match '['
(?:              : begin non-capture group
  (?:            : begin non-capture group
    (?<!\[)      : use negative lookbehind to assert current
                   position is not preceded by '['
    ,            : match ','
  |              : or
                 : match an empty string
  )              : end non-capture group
  \(\d{1,8},\d+  : match '(', 1-8 digits, ',', 1+ digits
  (?:            : begin non-capture group
    ,\(          : match ',('
    (?:          : begin non-capture group
      \d+        : match 1+ digits
      (?:,\d+)   : match ',', 1+ digits in a non-capture group
      +          : execute non-capture group 1+ times
    )?           : end non-capture group and make it optional
    \)           : match ')'
  )*             : end non-capture group and execute it 0+ times
  \)             : match ')'
)*               : end non-capture group and execute it 0+ times
\],\[\]$         : match '],[]' at end of string


0 commentaires