0
votes

Réutilisez le même préfixe pour trouver le prochain match si

J'ai ce genre de chaînes: xxx

sans aucun CR / LF, tout est sur une ligne.

Je veux créer une regex qui: < / p>

  • Si et seulement si l'URL commence par / transfert / paquets /
  • capture chaque GUID ultérieur
  • jusqu'à la fin de la chaîne citée "
  • Le nombre de GUID à trouver est inconnu et est au moins un

    jusqu'à présent, j'ai écrit: xxx

    mais il ne capture que le dernier GUI. J'ai besoin de comment réutiliser le préfixe / transfert / paquets / et continuez à faire correspondre avec impatience la recherche à chaque fois sans passer à partir du préfixe.


8 commentaires

Donc, vous voulez faire correspondre chacun des GUIDS tant qu'ils sont dans une chaîne qui commence par / transfert / packages / , oui?


Vous avez raison. (Plus tard dans la même chaîne, il peut y avoir d'autres URL = "/ transfert / package / ..." et ils doivent être capturés également, mais je ne pense pas que cela soit pertinent parce qu'il est donc tout à fait un autre morceau de la chaîne)


Quelle application utilisez-vous? BTW, - [A-ZA-Z0-9] {4} - [A-ZA-Z0-9] {4} - [A-ZA-Z0-9] {4} est meilleur écrit (?: - [a-za-z0-9] {4}) {3} peut-être?


Et au lieu d'essayer de le faire en une fois, utilisez peut-être deux étapes. Vérifiez d'abord si votre chaîne commence avec votre condition, utilisez un motif comme [A-ZA-Z0-9] {8} (?: - [A-ZA-Z0-9] {4}) {3}) {3} - [A-ZA-Z0-9] {12} Pour trouver toutes les sous-chaînes d'intérêt.


Oui, cela résout le problème. Cependant, je suis curieux de savoir si cela peut être fait dans un seul passage!


Quelle est la langue? Bien sûr, cela peut être fait, mais pas dans toutes les langues.


J'utilise la bibliothèque re dans Python3.6, cependant, ce n'est pas si indépendant de la langue?


Alors il ne peut pas.


3 Réponses :


1
votes

de ceci donc Réponse :

Quant à la deuxième question, c'est un problème courant. Il n'est pas possible d'obtenir un nombre arbitraire de captures avec une regex PCRE, comme en cas de captures répétées, seule la dernière valeur capturée est stockée dans le tampon de groupe. Vous ne pouvez pas avoir plus de submatchs dans la matrice résultante que le nombre de groupes de capture à l'intérieur du motif de regex. Voir Répéter un groupe de capture vs capturer un groupe répété pour plus de détails.


3 commentaires

Je comprends. Donc, la seule manière générique serait de le faire en deux étapes, non?


Je ne sais pas si cela pourrait être accompli avec deux étapes. La récursion peut être faite avec deux étapes, mais dans PCRE, elle ne captive que un groupe dans son ensemble et ne les divise pas.


Merci très intéressant de savoir.



2
votes

Si vous utilisez le module re dans Python, utilisez peut-être str.startwith et essayez: xxx


1 commentaires

Merci, cependant, le url = "" fait lui-même partie de la chaîne à rechercher dans, je suppose que cela n'est pas clair de mon message original, je vais le modifier.



1
votes

Vous pouvez utiliser le module PYPI Regex qui prend en charge des quantificateurs de longueur infinie dans le lookebehind: xxx pré>

exemple Démo Regex (avec un autre moteur sélectionné pour But de démonstration) ou voir un Python Demo P>


Une autre option est de la première correspondance la ligne qui a url = "/ transfert / paquets / code> suivi d'un GUID et correspond à la double citation suivante. p>

alors vous pouvez utiliser par exemple RE.FindAll Pour obtenir tous les GUID. P>

['00000000-0000-0000-0000-000000000000', '68f74d66-ca3d-4272-9b59-4f737946b3f7', '138bb190-3b12-4855-88e2-0d1cdf46aeb5']


2 commentaires

J'ai été lus avec le module regex pour une bonne heure maintenant. Ne pouvait pas le craquer. Bien fait. J'ai continué à regarder les options \ g mais je suis trop inexpérimenté pour faire ce travail. +


@JVDV Si vous souhaitez utiliser le \ g , vous devez trouver un moyen d'obtenir des correspondances en continu à l'aide de la position à la fin de la correspondance précédente. Une option pourrait être Regex101.com/r/yme3vz/1 . Les chances sont que ce modèle peut être simplifié :-)