Je pensais écrire un code rapide pour télécharger le nombre de "fans" une page Facebook.
Pour une raison quelconque, malgré un bon nombre d'itérations que j'ai essayées, je ne peux pas obtenir le code suivant Pour choisir le nombre de ventilateurs dans le HTML. Aucune des autres solutions que j'ai trouvées sur le Web ne correspond correctement à la regex dans ce cas. Il est certainement possible d'avoir des caractères génériques entre les deux bits correspondants? P>
Le texte que j'aimerais faire correspondre contre est " Je pensais à interroger ces données par intermittence et à écrire dans un fichier, mais je ne suis pas encore entendu à cela. Je me demande également si cela se dirige dans la bonne direction, car le code semble assez enclenché. :) p>
3 Réponses :
import urllib
import re
fbhandle = urllib.urlopen('http://www.facebook.com/Microsoft')
pattern = "6 of(.*)fans" #this wild card doesnt appear to work?
compiled = re.compile(pattern)
ms = compiled.search(fbhandle.read())
print ms.group(1).strip()
fbhandle.close()
You needed to use re.search() instead. Using re.match() tries to match the pattern against the whole document, but really you're just trying to match a piece inside the document. The code above prints: 79,110. Of course, this will probably be a different number by the time it gets run by someone else.
merci beaucoup - fonctionne très bien. Je ne suis pas sûr que je comprenne parfaitement la distinction, cependant - match () serait utilisé dans des cas où une sorte de Bool Eval était-elle réalisée sur une petite chaîne (ish)?
@EeAday: Bonne explication de la différence entre match code> et code>: AMK.ca/python/howto/regex/...
Le lien dans le commentaire ne fonctionne pas, je me demande quel est le diff entre la recherche et le match.
pas besoin de regex sortie p>
Evan Fosmark a déjà donné une bonne réponse. C'est juste plus d'informations.
Vous avez cette ligne: p> en général, ce n'est pas une bonne expression régulière. Si le texte d'entrée était: p> "6 sur 99 ventilateurs dans toute la galaxie des ventilateurs" p> alors le groupe de correspondance (la matière à l'intérieur des parenthèses) serait: p> "99 fans dans toute la galaxie de" p> Donc, nous voulons un motif qui prendra simplement ce que vous voulez, même avec un texte d'entrée idiot comme ci-dessus. P> Dans ce cas, peu importe que si vous faites correspondre à l'espace blanc, car lorsque vous convertissez une chaîne en un entier, l'espace blanc est ignoré. Mais écrivons le motif pour ignorer l'espace blanc. P> avec la carte générique Python a une correspondance non gourmande disponible, donc Vous pouvez réécrire avec ça. Les programmes plus anciens avec des expressions régulières peuvent ne pas avoir de correspondance non gourmande, donc je vais également donner un modèle qui ne nécessite pas non gourmandeux. P> Donc, le motif non gourmand: p> < pré> xxx pré> l'autre: p> Le Le premier modèle fait mieux que votre premier motif avec le texte d'entrée idiot: p> "6 de 99 fans de 99 dans toute la galaxie des fans" p> Il retournerait un groupe de correspondance de juste mais essayez cet autre texte d'entrée stupide: p> "6 sur 99 fans folles" p> Il retournerait un groupe de match de Le deuxième modèle ne correspondrait pas du tout, car le mot "folie" n'est pas le mot "fans". p> hmm. Voici un dernier modèle qui devrait toujours faire la bonne chose même avec des textes d'entrée idiotes: p> Ceci correspondra avec succès tout ce qui est non ambiguë non ambigu: p> "6 de 99 fans de l'ensemble de la galaxie des fans " p> Le groupe de correspondance sera " 6 sur 99 fans folles " p> Le groupe de match sera "6 sur 99 41 fans" p> Il ne correspondra pas, car il y avait un deuxième numéro là-bas. P> Pour en savoir plus sur les expressions régulières Python, vous pouvez lire Divers Web Pages . Pour un rappel rapide, à l'intérieur de l'interprète Python, faites: p> lorsque vous êtes "racler" du texte à partir d'une page Web, vous pouvez parfois exécuter des codes HTML. En général, les expressions régulières ne sont pas un bon outil pour ignorer le marquage HTML ou XML (voir ici ); Vous feriez probablement mieux d'utiliser belle soupe pour analyser le code HTML et extraire le texte, suivi de Une expression régulière pour attraper le texte que vous vouliez vraiment. P> J'espère que c'était intéressant et / ou éducatif. P> P> * code>, il est possible de faire correspondre une chaîne de longueur zéro. Dans ce cas, je pense que vous voulez toujours une correspondance non vide, vous souhaitez donc utiliser + code> pour correspondre à un ou plusieurs caractères. P> \ s code> signifie "n'importe quel espace blanc" et correspondra à un espace, un onglet et quelques autres caractères (tels que «Form Feed»). \ s code> signifie "tout espace de non-blanc" et correspond à tout ce que \ s code> serait pas em> match. p> 99 code>. P> 99 Crazed Code>. P> \ d code> correspond à n'importe quel chiffre ( '0 ' code> à ' 9 ' code>). \ d code> correspond à tout autre chiffre. p> 99 code>. p> 99 code>. p>
ne semble pas fonctionner i> n'est pas une description problématique
Sidenote: vous devriez nommer 'lignes' 'ligne' '
Veuillez poster le texte que vous essayez de faire correspondre et (si possible) le résultat que vous attendez.
Ungreedy
. *? Code> est utile dans des cas comme celui-ci.