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
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
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']
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.
merci. J'ai effectivement réussi avec l'analyseur, mais mon patron veut que j'utilise une expression régulière. – John
À 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
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
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.
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
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. –
Connaissez-vous la chaîne exacte que vous cherchez, ou est-ce juste un espace réservé? – intelis
je ne connais pas la chaîne exacte, c'est juste un espace réservé – John