0
votes

Python Regex: Parse Touche / Valeur paires d'une chaîne

J'essaie de désactiver une chaîne comme suit dans une liste des paires de touches / de valeur: xxx

J'ai écrit le code suivant à l'aide de Regex pour atteindre cet objectif: < Pré> xxx

Les correspondances que je reçoivent sont xxx

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.

Comment puis-je recevoir 4 correspondances, une pour chaque mot clé de la ligne?


5 commentaires

Utilisez un lookahead - regex = "(" + Any_keyword + "): (. +?) (? = (? =" + Any_keyword + "): | $)" . Ajouter : dans le lookahead après le mot-clé pour le rendre plus sûr. Voir Ideone.com/88O81D


Y 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 | $) fonctionnera


@Adrianshum il est nécessaire à cause de : . Chaque mot clé est suivi avec : , nous ne voulons pas arrêter de correspondre avant un : dans la partie valeur.


@ Wiktorstribiżew ah ha! Ca a du sens. J'ai raté votre côlon supplémentaire :)


3 Réponses :


0
votes

Un moyen d'utiliser re.split : xxx

sortie: xxx


0 commentaires

1
votes

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: xxx pré>

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 Trié (Mots-clés, Key = Len, Reverse = True) Code>. P>

Ce pourrait être une bonne idée de faire correspondre des mots-clés comme des mots entiers, aussi: 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>


0 commentaires

-1
votes

Une autre façon xxx


1 commentaires

Il ne supportera que des valeurs de mots «Word-Char».