2013-01-07 6 views
2

J'ai une chaîneRegex pour trouver un python de chaîne

<a href="/p/123411/"><img src="/p_img/411/123411/639469aa9f_123411_100.jpg" alt="ABCDXYZ" /> 

Quel est le Regex pour trouver ABCDXYZ en Python

+0

Connaissez-vous la chaîne exacte que vous cherchez, ou est-ce juste un espace réservé? – intelis

+0

je ne connais pas la chaîne exacte, c'est juste un espace réservé – John

Répondre

5

Utilisez BeautifulSoup.

from bs4 import BeautifulSoup as BS 
text = '''<a href="/p/123411/"><img src="/p_img/411/123411/639469aa9f_123411_100.jpg" alt="ABCDXYZ" />''' 
soup = BS(text) 
print soup.find('img').attrs['alt'] 
+0

Je pense que vous voulez dire 'soup.find ('img'). Attrs ['alt']'. Mais sinon, oui, c'est exactement ce qu'il devrait faire. – abarnert

+0

Ouais juste réparé. Je n'ai pas réalisé que le tag était dans 'img'. – jdotjdot

+0

Je dois utiliser Regex comme exigence – John

1

Si vous êtes à la recherche de la valeur de cette alt attribut, vous pouvez le faire :

>>> r = r'alt="(.*?)"' 

Puis:

>>> m = re.search(r, mystring) 
>>> m.group(1) 
'ABCDXYZ' 

Et vous pouvez utiliser re.findall si vous voulez en trouver plus d'un.

Cependant, ce code sera facilement berner par quelque chose comme ceci:

<span>Here's some text explaining how to do alt="foo" in an img tag.</span> 

D'autre part, il va aussi ne pas ramasser quelque chose comme ceci:

<img src='/p_img/411/123411/639469aa9f_123411_100.jpg' alt='ABCDXYZ' /> 

Comment faire vous faites face à cela? La réponse courte est: vous n'avez pas. XML et HTML ne sont pas des langages réguliers. Il vaut la peine de rappeler ici que le moteur re de Python n'est pas réellement un vrai moteur d'expression régulière - et, de plus, il est intégré dans un langage de programmation complet de Turing. Donc, évidemment, il est possible de construire un analyseur HTML autour de Python et re. This answer montre une partie d'un analyseur écrit en perl, où les regexes font la plupart des gros travaux. Mais cela ne signifie pas que devrait le faire de cette façon. Vous ne devriez pas écrire un analyseur en premier lieu, étant donné que d'excellents existent déjà, et si vous l'avez fait, vous ne devriez pas vous forcer à utiliser des expressions régulières même s'il existe un moyen plus simple de faire ce que vous voulez. Pour jouer rapidement, regex est bien. Pour un programme de production, c'est presque toujours la mauvaise réponse. Une façon de convaincre votre patron de vous laisser utiliser un analyseur consiste à créer une suite de tests qui sont tous manifestement valides, et qui ne peuvent être gérés par aucune solution basée sur une regex, à part un parseur complet. Si vous pouvez trouver un test qui peut être analysé, mais seulement en utilisant retours en arrière exponentielle, et prend donc 12 heures avec regex vs 0,1 seconde avec BS4, encore mieux, mais c'est un peu plus compliqué ...

Bien sûr, il est aussi vaut la peine de chercher des articles en ligne (et des questions comme SO this et this et les 300 autres dups) et en choisissant les meilleurs pour montrer votre patron.

Si vous ne pouvez vraiment pas convaincre votre patron autrement, alors vous avez terminé à ce stade. Compte tenu de ce qui a été spécifié, cela fonctionne. Compte tenu de ce qui peut ou ne peut pas être réellement prévu, rien de moins que la lecture d'esprit fonctionnera. Comme vous trouvez de plus en plus de cas réels qui échouent, vous pouvez le hacker en ajoutant des alternatives et/ou du contexte de plus en plus complexes sur la regex elle-même, ou éventuellement utiliser une série de regex et post-filtres. J'en ai marre et je me trouve un meilleur travail. N'utilisez pas regex pour analyser HTML.

+0

merci. J'ai effectivement réussi avec l'analyseur, mais mon patron veut que j'utilise une expression régulière. – John

+0

À moins qu'il y ait une raison que je ne peux pas voir ici, votre patron est très mal avisé en vous demandant d'utiliser une expression régulière. Il y a une raison pour laquelle les analyseurs existent. – jdotjdot

+0

Je vous conseille de dire à votre patron qu'il ne sait vraiment pas de quoi il parle s'il vous dit d'utiliser regex. Voir [ici] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – Amelia

0

Tout d'abord, un avertissement: Vous ne devriez pas utiliser des expressions régulières pour analyser HTML.Vous pouvez utiliser BeautifulSoup pour cette

Ensuite, si vous êtes réellement sérieux au sujet de l'utilisation des expressions régulières et vous pouvez ci-dessus est le cas exact que vous voulez faire quelque chose comme:

<a href="[a-zA-Z0-9/]+"><img src="[a-zA-Z0-9/]+" alt="([a-zA-Z0-9/]+)" /> 

et vous pouvez accéder au texte via l'attribut groups de l'objet de correspondance.

+0

Quelle raison avons-nous de croire qu'être dans une balise 'a' - et avec une URL relative, et aucun autre attribut - est pertinent ici? En l'absence d'un énoncé de problème réaliste (ce qui rendrait le problème impossible), il est probablement préférable de supposer l'interprétation la plus simple possible. – abarnert

+0

Il était assez spécifique. En étant aussi simple que possible, vous ne répondez pas non plus à sa question aussi précisément que possible. Je doute qu'il aurait tiré l'exemple de nulle part si ce n'était pas quelque chose dont il s'occupait spécifiquement. S'il peut garantir les conditions qu'il a fournies (ce qu'il ne peut probablement pas), alors ce qui précède fonctionne. –

Questions connexes