2016-03-25 10 views
-1

Ich möchte in Python jedes Auftreten von etwas zwischen bestimmten Ausdruck übereinstimmen. Zum Beispiel:Ziehen Regex-Match ohne seine Umgebung

dogdogacowadogdog <-- search a word between 'a' characters 
<span>tiger<a>  <-- search for sth between <span> and <a> 

würde Ich mag nur diese etwas zwischen, passen so würde es cow und tiger sind. Wenn Sie jedoch rexexes:

r'a(.*)a' 
r'<span>(.*)<a>' 

Er druckt mir die ganze Linie und nicht nur das, was ich suche (was durch (.*) abgestimmt ist). Wie kann ich diese Informationen abrufen?

+3

Es klingt wie du willst '(. *?)' (Lazy Matching). Auch ich hoffe, dass Sie HTML mit Regex nicht analysieren ... –

+0

Welche 're' Funktion verwenden Sie? –

+1

müssen Sie die einfangende Gruppe verwenden. – Whitefret

Antwort

3

Die Regex, die Sie suchen, ist non-greedy passend.

Was ist nicht-gierig passend?

.*, .+ und .? versuchen, so viele Zeichen wie möglich abzugleichen. Durch das Hinzufügen eines Fragezeichens (?) nach diesen Zeichen wird versucht, die kleinstmöglichen Zeichen zu finden. .*? wird 0 Zeichen übereinstimmen, wenn sie kann und .+? 1.

Zurück zu Ihrer Frage passen, sollten Sie dies als Ihre regex Abfrage verwenden:

r'a(.*?)a' 
r'<span>(.*?)<a>' 

Als nächstes ist die Anpassung selbst:

Wenn Sie match =re.search() verwenden, müssen Sie match.group(1) und nicht match.group(0) erhalten, um die Gruppe selbst zu erhalten.

match.group(0) gibt das gesamte Spiel aus (einschließlich des Teils vor und nach der Gruppe).

match.group(1) gibt nur die erste Gruppe aus.

match.groups() jedoch nimmt nur die Gruppen (nicht die gesamte Übereinstimmung) heraus, so match.groups()[0] wird die erste Gruppe sein.

+0

Können Sie kurz erklären, warum sollte .group (1) und nicht .group (0) verwendet werden? –

+0

Gruppe (0) ist das ganze Spiel, dh die erste einfangende Gruppe – Whitefret

+0

@ BartłomiejSzałach Weitere in der Antwort erklärt. Die Links verweisen auf die richtigen Teile in der "re" -Dokumentation zur weiteren Erklärung dieses Verhaltens. – Bharel

Verwandte Themen