J'ai essayé de résoudre ce problème pendant un moment, mais je ne peux tout simplement pas le faire correctement. P>
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. P>
chaîne de test: p>
Blocs de numéro valide:
Blocs de numéro non valides:
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 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. P>
Merci d'avance. P> [(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, (), (), ())], [] code> p>
16908, 18404, 16823, 16905, etc code> p>
2585, 2585, 1887, etc code> p>
(\ d {0,8}) code> ne me semble pas très adéquat. P>
3 Réponses :
Cette regex veut que vous avez besoin de Démo:
https://regex101.com/r/oz0bde/1 p> Code Python: p> sortie: p> r '\ (((\ d {1,8}), \ d + (?:, \ (\ d *,? \ d * ,? \ d * \) {3} \) ' code>?
Belle solution également et a le comportement exact que je cherchais. Merci beaucoup
J'ai trouvé un moyen de le faire avec deux regexes: sortie est: p> est-ce le comportement que vous voulez? p> p>
Plus que parfait! Parfois est moins plus :)
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
Mon sentiment est que c'est que c'est vraiment le travail d'un parseur formel i>, 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 code> de(0,0, (), (), ()) code> un bloc de numéro valide?Bon point @telmotrooper. C'est un nombre valide aussi.
Pourtant, vous avez
(16908,76, (2585,0,0), (), (), ()) code> 16908 répertorié comme valide.Quelque chose à quoi penser.
Si un autre support est ouvert avant que le précédent soit fermé code> python re i> ne supporte pas le texte équilibré. Fondamentalement, ce que vous recherchez ne peut être accompli avec ce moteur. Il peut être avec le moteurRegex code> cependant. i>