Wildcard-matching eine Zeichenfolge in Python regex-Suche
Ich dachte, ich würde schreiben einige quick code zum herunterladen der Anzahl von "fans" einer Facebook-Seite hat.
Aus irgendeinem Grund, trotz einer angemessenen Anzahl von Iterationen, die ich ausprobiert habe, die ich nicht bekommen kann den folgenden code ein, wählen die Anzahl der fans in den HTML-Code. Keine der anderen Lösungen, die ich im Internet gefunden habe richtig match der regex in diesem Fall entweder. Sicherlich ist es möglich, einige Platzhalter zwischen den zwei zusammengehörenden bits?
Den text, ich würde gerne match gegen "6 X fans", wobei X für eine beliebige Anzahl von fans eine Seite hat, würde ich gerne diese Zahl.
Ich dachte der Abfrage dieser Daten, die nur zeitweise und in eine Datei schreiben, aber ich habe nicht bekommen, um das noch. Ich bin auch gefragt, ob dieser Weg ist in die richtige Richtung, wie der code scheint ziemlich klobig. 🙂
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()
- nicht erscheint zu arbeiten ist kein problem-Beschreibung
- nebenbei bemerkt: sollte man sich den Namen 'lines', 'line'
- Bitte posten Sie den text, den Sie versuchen, match gegen und (wenn möglich) das Ergebnis, das Sie erwarten.
- Ungreedy
.*?
ist hilfreich in Fällen wie diesem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mussten Sie
re.search()
statt. Mitre.match()
versucht, die Muster gegen die ganze Dokument, aber wirklich, du bist einfach nur versucht, ein Stück innerhalb des Dokuments. Der obige code druckt:79,110
. Natürlich, dies wird wahrscheinlich eine unterschiedliche Anzahl von die Zeit, die es ausführen, ruft jemand anderes.match
undsearch
: amk.ca/python/howto/regex/...Evan Fosmark gab schon eine gute Antwort. Dies ist nur mehr info.
Haben Sie diese Zeile:
Im Allgemeinen ist dies nicht ein guter regulärer Ausdruck. Wenn die Eingabe von text war:
"6 von 99 fans in der ganzen galaxy-fans"
Dann der match-Gruppe (das Zeug in Klammern) wäre:
" 99 fans in der ganzen Galaxie "
So, wir möchten ein Muster, nur packen, was Sie wollen, sogar mit einem dummen Eingabe von text wie den oben genannten.
In diesem Fall spielt es eigentlich keine Rolle, ob Sie mit den weißen Raum, weil beim konvertieren einer Zeichenfolge in eine ganze Zahl, Leerzeichen werden ignoriert. Aber schreiben Sie das Muster zu ignorieren, weißen Raum.
Mit der
*
Platzhalter ist es möglich, eine übereinstimmung mit einem string der Länge null. In diesem Fall denke ich, Sie wollen immer eine nicht-leere Stimmen überein, sodass die Sie verwenden möchten+
auf übereinstimmung mit einem oder mehr Zeichen.Python hat non-greedy matching zur Verfügung stehen, so könnte man umschreiben mit, dass. Ältere Programme, die mit regulären Ausdrücken kann nicht non-greedy matching, also werde ich auch geben, ein Muster, das nicht erforderlich ist, nicht gierig.
So, die non-greedy-Muster:
Dem anderen:
\s
bedeutet "weiße Platz" und passen auf ein Leerzeichen, ein tab und ein paar andere Zeichen (wie "form feed").\S
bedeutet "alle nicht-weißen-Raum" und entspricht allem, dass\s
würde nicht match.Ersten Muster funktioniert besser als die ersten Muster mit den dummen text eingeben:
"6 von 99 fans in der ganzen galaxy-fans"
Würde es wieder ein match Gruppe von nur
99
.Aber versuchen, diese andere dumme input text:
"6 von 99 verrückten fans"
Würde es wieder eine Spiel-Gruppe von
99 crazed
.Das zweite Muster nicht zusammenpassen, weil das Wort "verrückt" nicht das Wort "fans".
Hmm. Hier ist ein letztes Muster, das sollte immer das richtige tun, auch mit dummen input-Texte:
\d
einer beliebigen Ziffer entspricht ('0'
zu'9'
).\D
entspricht einem beliebigen nicht-Ziffer.Dies wird erfolgreich mit etwas, das aus der Ferne eindeutig:
"6 von 99 fans in der ganzen galaxy-fans"
Match-Gruppe
99
."6 von 99 verrückten fans"
Match-Gruppe
99
."6 von 99 41 fans"
Wird es nicht überein, denn es war eine zweite Nummer drin.
Erfahren Sie mehr über Python reguläre Ausdrücke, können Sie Lesen verschiedene web Seiten. Für eine schnelle Erinnerung, das innerhalb der Python-interpreter nicht:
Wenn Sie "kratzen", text aus einer web-Seite, die Sie vielleicht manchmal in Konflikt geraten HTML-codes. Im Allgemeinen, reguläre Ausdrücke sind nicht ein gutes Werkzeug für die Nichtberücksichtigung von HTML-oder XML-markup (siehe hier); Sie würden wohl besser tun zu verwenden Schöne Suppe zum analysieren von HTML und extrahieren Sie den text, gefolgt von einem regulären Ausdruck greifen Sie den text, den Sie wirklich wollte.
Ich hoffe, das war interessant und/oder informativ.
brauchen keine regex
Ausgabe