Comment puis-je regex match avec le groupement inconnu nombre de groupes
Je veux faire une regex match (en Python) sur la sortie du journal d'un programme. Le journal contient des lignes qui ressemblent à ceci:
...
VALUE 100 234 568 9233 119
...
VALUE 101 124 9223 4329 1559
...
Je voudrais saisir la liste des numéros qui se produit après la première incidence de la ligne qui commence avec la VALEUR. c'est à dire, je veux qu'il revienne ('100','234','568','9233','119')
. Le problème est que je ne sais pas à l'avance combien de numéros, il y aura.
J'ai essayé de l'utiliser comme une regex:
VALUE (?:(\d+)\s)+
Correspond à la ligne, mais il ne saisit la dernière valeur, alors j'ai juste get ('119',).
- Basée sur une précédente question, je vois qu'il n'est pas possible avec les expressions régulières: stackoverflow.com/questions/464736/...
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez est un analyseur, au lieu d'une expression régulière. Dans votre cas, je voudrais envisager d'utiliser un très simple analyseur,
split()
:Vous pouvez utiliser une expression régulière pour voir si votre ligne d'entrée correspond à votre format attendu (en utilisant les regex dans votre question), puis vous pouvez exécuter le code ci-dessus, sans avoir à vérifier pour
"VALUE"
et sachant que leint(x)
de conversion est toujours une réussite, puisque vous avez déjà confirmé que le caractère suivant des groupes de chiffres.Qui ne valider que le mot "VALEUR" apparaît au début de la chaîne, et il n'a pas de valider qu'il y a exactement un espace entre les éléments, mais si vous pouvez faire cela comme une étape distincte (ou si vous n'avez pas besoin de le faire), alors il va trouver toutes les séquences de chiffres dans une chaîne.
Une autre option n'est pas décrite ici est d'avoir un tas d'option de capturer les groupes.
Cette regex permet de saisir jusqu'à 5 groupes de chiffres séparés par des espaces. Si vous avez besoin de plus d'éventuels groupes, il suffit de copier et de coller plus
*(\d+)?
blocs.Vous pouvez simplement exécuter vous êtes principale match regex alors exécuter une secondaire regex sur ces matchs pour obtenir les numéros:
C'est bien sûr aussi, si vous ne voulez pas écrire un analyseur complet.
J'ai eu ce même problème et ma solution a été d'utiliser deux expressions régulières: le premier match de l'ensemble du groupe, je suis intéressé et la seconde pour analyser les sous-groupes. Par exemple, dans ce cas, j'aimerais commencer avec ceci:
Ce qui devrait résulter en trois matches: [0] l'ensemble de la ligne [1], la substance après la valeur [2] le dernier espace+valeur.
[0] et [2] peut être ignoré et puis [1] peut être utilisé avec les éléments suivants:
Remarque: ces expressions régulières n'ont pas été testés, j'espère que vous obtenez l'idée.
La raison pour laquelle La réponse de Greg ne fonctionne pas pour moi est parce que la 2ème partie de l'analyse est plus complexe et n'est pas simplement quelques chiffres séparés par un espace.
Cependant, je n'ai honnêtement aller avec Greg solution de cette question (c'est probablement la façon la plus efficace).
Je suis juste écrit cette réponse dans le cas où quelqu'un est à la recherche d'une solution plus complexes comme j'avais besoin.
Vous pouvez utiliser
re.match
de vérifier d'abord et appelerre.split
d'utiliser une regex comme séparateur pour diviser.Le séparateur
"\s+"
peut être plus compliqué.