Générique correspondant d'une chaîne de caractères en Python regex de recherche
J'ai pensé que je pourrais écrire quelques code pour télécharger le nombre de "fans" Facebook page.
Pour une raison quelconque, malgré un bon nombre d'itérations, j'ai essayé, je ne peux pas avoir le code suivant pour choisir le nombre de fans dans le code HTML. Aucune des autres solutions que j'ai trouvé sur le web correctement le regex dans ce cas. Sûrement est-il possible d'avoir quelques génériques entre les deux bits correspondants?
Le texte j'aimerais match contre est "6 X fans", où X est un nombre arbitraire de fans d'une page a - je voudrais obtenir ce numéro.
Je pensais de l'interrogation de ces données par intermittence et en écriture à un fichier, mais je n'ai pas eu l'occasion de ça pour l'instant. Je me demande aussi si c'est dans la bonne direction, que le code semble assez maladroit. 🙂
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)
for lines in fbhandle.readlines():
ms = compiled.match(lines)
print ms #debugging
if ms: break
#ms.group()
print ms
fbhandle.close()
note: vous devriez nom de 'lignes' ''en ligne'
Veuillez poster le texte que vous essayez de faire correspondre et (si possible) le résultat que vous attendez.
Moins gourmand
.*?
est utile dans les cas de ce genre.OriginalL'auteur oneAday | 2010-01-03
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'utiliser
re.search()
à la place. À l'aide dere.match()
essaie de correspondre à la forme contre la ensemble document, mais vraiment, vous êtes juste essayer de faire correspondre un morceau à l'intérieur du document. Le code ci-dessus imprime:79,110
. Bien sûr, ce sera probablement un autre chiffre par le nombre de fois qu'il est exécuté par quelqu'un d'autre.bonne explication de la différence entre
match
etsearch
: amk.ca/python/howto/regex/...pourquoi ne pas accepter cette réponse si cela fonctionne pour vous?
oups, terriblement désolé.
OriginalL'auteur Evan Fosmark
Evan Fosmark déjà donné une bonne réponse. C'est juste un peu plus d'info.
Vous avez cette ligne:
En général, ce n'est pas une expression régulière. Si l'entrée de texte était:
"6 de 99 fans de toute la galaxie de fans"
Puis le match de groupe (les trucs à l'intérieur des parenthèses) serait:
" 99 fans de toute la galaxie des "
Donc, nous voulons un modèle qui va juste prenez ce que vous voulez, même avec une bête de saisie de texte comme ci-dessus.
Dans ce cas, il n'a pas vraiment d'importance si vous correspondez à l'espace blanc, parce que quand vous convertir une chaîne en un entier, l'espace est ignoré. Mais nous allons écrire le modèle d'ignorer les espaces blancs.
Avec le
*
générique, il est possible d'associer une chaîne de longueur zéro. Dans ce cas, je pense que vous voulez toujours non vide de match, si vous souhaitez utiliser+
pour correspondre à un ou plusieurs caractères.Python a non-greedy correspondants disponibles, de sorte que vous pouvez réécrire. Les anciens programmes avec des expressions régulières peut pas non gourmande de correspondance, donc je vais aussi donner un modèle qui ne nécessite pas de non-greedy.
Donc, la non-greedy modèle:
L'autre:
\s
signifie "n'importe quel espace blanc" et correspondent à un espace, une tabulation, et quelques autres caractères ("form feed").\S
signifie "non-blanc" et correspond à tout ce qui\s
serait pas match.Le premier modèle fait mieux que votre premier modèle avec le ridicule de saisie de texte:
"6 de 99 fans de toute la galaxie de fans"
Il serait de retour d'un match de groupe de la juste
99
.Mais essayez cette autre idiot de saisie de texte:
"6 de 99 fous les fans de"
Il serait de retour d'un match de groupe de
99 crazed
.Le second modèle ne correspondent pas du tout, parce que le mot "fou" n'est pas le mot "fans".
Hmm. Voici un dernier motif qui doit toujours faire la bonne chose, même avec une bête de saisie de textes:
\d
correspond à un chiffre ('0'
à'9'
).\D
correspond à n'importe quel chiffre.Ce succès correspondent à rien de ce qui est à distance non-ambiguë:
"6 de 99 fans de toute la galaxie de fans"
Le match de groupe sera
99
."6 de 99 fous les fans de"
Le match de groupe sera
99
."6 99 41 fans"
Il ne sera pas le match, car il y avait un second nombre de.
Pour en savoir plus à propos de Python expressions régulières, vous pouvez lire divers web pages. Pour un petit rappel, à l'intérieur de l'interpréteur Python, n':
Lorsque vous êtes "grattage" du texte à partir d'une page web, vous pourriez parfois aller à l'encontre de codes HTML. En général, les expressions régulières ne sont pas un bon outil pour le briser HTML ou de balisage XML (voir ici); vous serait probablement mieux d'utiliser Belle Soupe pour analyser le code HTML et d'en extraire le texte, suivie par une expression régulière pour saisir le texte que vous avez vraiment envie.
J'espère que c'était intéressant et/ou éducatif.
intéressant ET éducatif - fantastique. merci beaucoup.
OriginalL'auteur steveha
n'avez pas besoin de regex
sortie
OriginalL'auteur ghostdog74