Ich bin ein Neuling in Python. Ich lerne Regex, aber ich brauche hier Hilfe.
Hier kommt die HTML-Quelle:
<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>
Ich versuche, ein Werkzeug zu codieren, das nur http://ptop.se
ausgibt. Kannst du mir bitte helfen?
Wenn Sie nur einen suchen:
import re
match = re.search(r'href=[\'"]?([^\'" >]+)', s)
if match:
print match.group(0)
Wenn Sie eine lange Zeichenfolge haben und jede Instanz des Musters darin haben möchten:
import re
urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)
print ', '.join(urls)
Dabei ist s
die Zeichenfolge, in der Sie nach Übereinstimmungen suchen.
Kurze Erklärung der Regexp-Bits:
r'...'
ist eine "rohe" Zeichenfolge. Sie müssen sich nicht mehr darum kümmern, Charaktere zu entkommen, als Sie es normalerweise tun würden. (\
besonders - in einer rohen Zeichenfolge ist ein\
nur ein\
. In einer regulären Zeichenfolge müssten Sie\\
jedes Mal tun, und dies wird old in Regexxse.)"
href=[\'"]?
" sagt aus, um mit "href =" übereinzustimmen, möglicherweise gefolgt von einem'
oder"
. "Möglicherweise", weil es schwer zu sagen ist, wie schrecklich der HTML-Code ist, den Sie betrachten, und die Anführungszeichen nicht unbedingt erforderlich sind.Das Einschließen des nächsten Bits in "
()
" bedeutet, dass es sich um eine "Gruppe" handelt, was bedeutet, dass es aufgeteilt und separat an uns zurückgegeben wird. Es ist nur eine Möglichkeit zu sagen "das ist der Teil des Musters, an dem ich interessiert bin.""
[^\'" >]+
" bedeutet, dass alle Zeichen übereinstimmen, die nicht'
,"
,>
oder ein Leerzeichen sind. Im Wesentlichen ist dies eine Liste von Zeichen, die ein Ende der URL darstellen. Auf diese Weise vermeiden wir den Versuch, einen regulären Ausdruck zu schreiben, der zuverlässig mit einer vollständigen URL übereinstimmt, was ein wenig kompliziert sein kann.
Der Vorschlag in einer anderen Antwort zur Verwendung von BeautifulSoup ist nicht schlecht, führt jedoch zu höheren externen Anforderungen. Außerdem hilft es Ihnen nicht bei Ihrem erklärten Ziel, Regex-Effekte zu lernen, von dem ich annehmen würde, dass dieses spezifische HTML-Parsing-Projekt nur ein Teil davon ist.
Es ist ziemlich einfach zu tun:
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_to_parse)
for tag in soup.findAll('a', href=True):
print tag['href']
Sobald Sie BeautifulSoup installiert haben, sowieso.
Verwenden Sie keine Regexen, verwenden Sie BeautifulSoup . Das, oder sei so cruftig, um es zum Beispiel zu w3m/lynx zu bringen und sich zurückzuziehen, was w3m/lynx rendert. Erstens ist es wahrscheinlich eleganter, zweitens hat es mit etwas unoptimiertem Code, den ich vor einiger Zeit geschrieben habe, viel schneller gearbeitet.
dies sollte funktionieren, obwohl es vielleicht elegantere Wege gibt.
import re
url='<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>'
r = re.compile('(?<=href=").*?(?=")')
r.findall(url)
John Gruber (der Markdown geschrieben hat, der aus regulären Ausdrücken besteht und hier direkt bei Stack Overflow verwendet wird) hat einen regulären Ausdruck erstellt, der URLs im Text erkennt:
http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
Wenn Sie nur die URL übernehmen möchten (d. H. Sie versuchen nicht wirklich, den HTML-Code zu analysieren), ist dies möglicherweise einfacher als ein HTML-Parser.
Regexes sind beim Analysieren von HTML grundsätzlich schlecht (siehe Können Sie einige Beispiele nennen, warum es schwierig ist, XML und HTML mit einem Regex zu analysieren? warum). Was Sie brauchen, ist ein HTML-Parser. Siehe Können Sie ein Beispiel für das Analysieren von HTML mit Ihrem bevorzugten Parser angeben? für Beispiele mit verschiedenen Parsern.
Insbesondere sollten Sie sich die Python-Antworten anschauen: BeautifulSoup , HTMLParser und lxml .
Ja, es gibt Tonnen von ihnen auf regexlib . Das beweist nur, dass RE nicht dazu verwendet werden sollte. Verwenden Sie SGMLParser oder BeautifulSoup oder schreiben Sie einen Parser - aber keine REs. Diejenigen, die zu funktionieren scheinen, sind äußerst kompliziert und decken dennoch nicht alle Fälle ab.
Es gibt Tonnen von ihnen auf regexlib
Dies funktioniert ziemlich gut mit optionalen Übereinstimmungen (Drucke nach href=
) und erhält nur den Link. Getestet auf http://pythex.org/
(?:href=['"])([:/.A-z?<_&\s=>0-9;-]+)
Ausgabe:
Übereinstimmung 1./wiki/Main_Page
Match 2./wiki/Portal: Inhalt
Match 3./wiki/Portal: Featured_content
Match 4./wiki/Portal: Aktuelle Veranstaltungen
Match 5./wiki/Special: Zufällig
Match 6. //donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=de
Sie können dies verwenden.
<a[^>]+href=["'](.*?)["']
dieser reguläre Ausdruck kann Ihnen helfen, Sie sollten die erste Gruppe nach\1 oder einer anderen Methode in Ihrer Sprache erhalten.
href="([^"]*)
beispiel:
<a href="http://www.amghezi.com">amgheziName</a>
ergebnis:
http://www.amghezi.com