47 votes

Python - Utilisation de regex pour trouver des correspondances multiples et les imprimer

J'ai besoin de trouver le contenu de formulaires à partir d'un fichier source HTML, j'ai fait quelques recherches et j'ai trouvé une très bonne méthode pour le faire, mais le problème est qu'elle n'imprime que le premier formulaire trouvé, comment puis-je le parcourir en boucle et afficher le contenu de tous les formulaires, pas seulement le premier ?

line = 'bla bla bla<form>Form 1</form> some text...<form>Form 2</form> more text?'
matchObj = re.search('<form>(.*?)</form>', line, re.S)
print matchObj.group(1)
# Output: Form 1
# I need it to output every form content he found, not just first one...

5 votes

Vous ne voulez vraiment pas analyser le HTML avec des expressions régulières. stackoverflow.com/questions/1732348/

0 votes

89voto

Petr Viktorin Points 13687

N'utilisez pas d'expressions régulières pour analyser le HTML.

Mais si vous avez besoin de trouver toutes les correspondances regexp dans une chaîne, utilisez la fonction findall fonction.

import re
line = 'bla bla bla<form>Form 1</form> some text...<form>Form 2</form> more text?'
matches = re.findall('<form>(.*?)</form>', line, re.DOTALL)
print(matches)

# Output: ['Form 1', 'Form 2']

1 votes

Que font les États-Unis ?

3 votes

Fait le '.' correspond à n'importe quel caractère, y compris une nouvelle ligne ; sans ce drapeau, '.' correspondra à tout sauf un saut de ligne. ( docs.python.org/2/library/re.html#re.S )

0 votes

Oh, je vois, je suis allé sur la page web mais je n'ai pas compris la documentation parce que rien n'était en dessous de re.S mais maintenant je vois comment lire la documentation, re.S et re.DOTALL sont les mêmes...merci !

33voto

Aamir Adnan Points 10903

Au lieu d'utiliser re.search utiliser re.findall il vous renverra toutes les correspondances dans un List . Ou vous pouvez également utiliser re.finditer (que j'aime le plus utiliser), il renverra un Iterator Object et vous pouvez simplement l'utiliser pour itérer sur toutes les correspondances trouvées.

line = 'bla bla bla<form>Form 1</form> some text...<form>Form 2</form> more text?'
for match in re.finditer('<form>(.*?)</form>', line, re.S):
    print match.group(1)

1 votes

Que font les États-Unis ?

0 votes

re.finditer est exactement ce dont j'avais besoin ! Merci !

1 votes

@Pinocchio docs say : re.S est identique à re.DOTALL Make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline. (j'ai posté ceci parce que je crois que les gens comme moi viennent souvent sur stackoverflow.com pour trouver des réponses rapidement)

6voto

ThiefMaster Points 135805

L'utilisation de regex à cette fin est une mauvaise approche. Puisque vous utilisez Python, vous disposez d'une bibliothèque vraiment impressionnante pour extraire des parties de documents HTML : BelleSoupe .

1 votes

Oh je ne le savais pas, je viens de découvrir Python hier :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X