7
votes

Correspondre au dernier événement avec regex

Je voudrais faire correspondre la dernière occurrence d'un motif à l'aide de regex.

J'ai du texte structuré de cette manière: p> xxx pré>

Je veux correspondre au dernier texte entre Deux code> dans mon cas
Tizi Ouzou code>, idéalement le Tizi Ouzou code> String P>

Notez qu'il existe des espaces blancs après le dernier code> em> p>

J'ai essayé ceci: p>

<br>.*<br>\s*$


2 commentaires

Essayez . *? au lieu de . * .


@Waleedkhan qui n'aidera pas


6 Réponses :


6
votes

Vous pouvez utiliser dans quantifier gourmand avec une classe de caractères réduite (en supposant que vous n'avez aucune balise entre vous ): xxx

ou xxx

pour permettre des balises à l'intérieur.

Étant donné que la chaîne que vous recherchez est Tizi Ouzou sans vous peut extraire le premier groupe de capture.


1 commentaires

@ m.Buettner: Vous avez raison, car la chaîne est analysée de gauche à droite et arrête à la première occurrence de



3
votes

Essayez: xxx pré>

Il consomme d'abord toutes les données jusqu'à ce que le dernier code> et des backtracks jusqu'à ce qu'il vérifie avec une autre code> après cela, puis extrait le contenu entre eux. P>

Il donne: P>

re.match(r'(?s).*<br>(.*)<br>', s).group(1)


2 commentaires

Pas besoin de la lookahead - le motif après que le lookahead vérifie exactement la même chose.


@ m.Buettner: merci. Ajouté cette version à la réponse.



13
votes

Une approche non regex à l'aide de la fonction str code> STR:

text = """
Pellentesque habitant morbi tristique senectus et netus et
lesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae
ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam
egestas <br>semper<br>tizi ouzou<br>Tizi Ouzou<br>       """

res = text.rsplit('<br>', 2)[-2]
#Tizi Ouzou


0 commentaires

4
votes

Comment sur [^ <>] * au lieu de . * : xxx

impression xxx


0 commentaires

7
votes

Regardez les questions connexes: Vous ne devriez pas analyser HTML avec Regex . Utilisez plutôt un analyseur Regex. Pour Python, j'entends Belle soupe est la voie à suivre.

Quoi qu'il en soit, si Vous voulez le faire avec regex, vous devez vous assurer que . * ne peut pas dépasser un autre . Pour ce faire, avant de consommer chaque personnage, nous pouvons utiliser un Lookahead pour que ce soit Ne démarre pas un autre : xxx


0 commentaires

14
votes

Pour moi, le moyen le plus clair est: xxx


0 commentaires