J'essaie de désactiver une chaîne comme suit dans une liste des paires de touches / de valeur: J'ai écrit le code suivant à l'aide de Regex pour atteindre cet objectif: P> < Pré> xxx pré> Les correspondances que je reçoivent sont p> et, bien sûr, ils incluent des mots clés2 et le mot-clé3 à la fin de la chaîne afin que je n'ai pas 't obtenir des objets de correspondance supplémentaires pour ces mots-clés. P> Comment puis-je recevoir 4 correspondances, une pour chaque mot clé de la ligne? p> p>
3 Réponses :
Un moyen d'utiliser sortie: p> re.split code>:
Vous pouvez extraire les allumettes à l'aide d'un lookahead plutôt qu'un groupe non capturant comme dernier modèle de la regex depuis qu'un modèle de groupe non capturé consomme toujours des caractères: Voir le Demo Python P> Si vos touches peuvent contenir des espaces, assurez-vous de trier les touches avant de définir Any_Keyword Code> Modèle en les triant par longueur dans l'ordre décroissant, par exemple Ce pourrait être une bonne idée de faire correspondre des mots-clés comme des mots entiers, aussi: P> Trié (Mots-clés, Key = Len, Reverse = True) Code>. P> regex = r"\b(" + any_keyword + r"):(.+?)(?=\b(?:" + any_keyword + "):|$)"
\ b code> - une limite de mot li>
(mot-clé1 | keyword2 | mots-clés3) code> - groupe 1: alternatives de mots-clés li>
: code> - A : code> Char li>
(. +?) code> - Le groupe 2: Un ou plusieurs caractères autres que des caractères de rupture de ligne aussi peu que possible li>
(? = \ b (?: Mots-clés1 | Mot-clé 2 | Mot-clé3): | $) code> - une lunette de vue positive qui s'assure que, immédiatement à droite de la position actuelle, il y a soit
\ b (?: mot-clé1 | mot-clé2 | mot-clé3): code> - tout mot-clé de la liste suivie avec : li> li>
| code> - ou li>
$ code> - fin de la chaîne. li>
ul> li>
ul> p>
Une autre façon
Il ne supportera que des valeurs de mots «Word-Char».
Utilisez un lookahead i> -
regex = "(" + Any_keyword + "): (. +?) (? = (? =" + Any_keyword + "): | $)" code >. Ajouter: code> dans le lookahead après le mot-clé pour le rendre plus sûr. Voir Ideone.com/88O81DY a-t-il une chance d'avoir de la place dans la clé et la valeur? IMHO, comme la réponse de @TJCwood a du sens, en regardant simplement une paire non spatiale autour d'un côlon
@ Wiktorstribiżew Vous n'avez pas besoin d'un groupe supplémentaire non capturant dans le groupe Lookahead. Tout simplement
(? = Key1 | Key2 | Key3 | $) code> fonctionnera@Adrianshum il est nécessaire à cause de
: code>. Chaque mot clé est suivi avec: code>, nous ne voulons pas arrêter de correspondre avant un: code> dans la partie valeur.@ Wiktorstribiżew ah ha! Ca a du sens. J'ai raté votre côlon supplémentaire :)