Was ist der Unterschied zwischen re.search und re.match?
Was ist der Unterschied zwischen den search()
und match()
Funktionen in der Python re
- Modul?
Ich habe gelesen, die Dokumentation (aktuelle Dokumentation), aber ich habe nie scheinen, Sie zu erinnern. Ich muss immer wieder nachlesen und neu zu lernen. Ich bin der Hoffnung, dass jemand beantworten übersichtlich, mit Beispielen, so dass (vielleicht) wird es bleiben in meinem Kopf. Oder zumindest werde ich einen besseren Ort, um zurückzukehren mit meiner Frage und es wird weniger Zeit, um neu zu lernen.
InformationsquelleAutor Daryl Spitzer | 2008-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
re.match
verankert wird am Anfang der Zeichenfolge. Das hat nichts zu tun mit newlines, so ist es nicht das gleiche wie mit^
im Muster.Als re.match-Dokumentation sagt:
re.search
durchsucht den gesamten string, wie die Dokumentation sagt:Also, wenn Sie brauchen, um übereinstimmung am Anfang des Strings, oder entsprechen die gesamte Zeichenfolge verwenden
match
. Es ist schneller. Ansonsten verwenden Siesearch
.Die Dokumentation hat eine speziellen Abschnitt für
match
vs.search
, deckt auch mehrzeilige strings:Nun, genug geredet. Zeit finden Sie einige Beispiel-code:
Warum würde jemand verwenden, beschränkt
match
eher als allgemeinersearch
dann? ist es für die Geschwindigkeit?Spiel ist viel schneller als die Suche, so zu tun, anstatt regex.search("Begriff"), die Sie tun können, regex.match - ((.*?)word(.*?)) und gewinnen Tonnen von performance-arbeiten Sie mit Millionen von Proben.
Gut, das ist doof. Warum nennen Sie es
match
? Ist es ein cleverer Schachzug, der Samen der API ' s mit unintuitive Namen zwingen mich, die Dokumentation zu Lesen? Ich will immer noch nicht! Rebell!sieht ein bisschen
faster
als suchen, wenn mit dem gleichen regulären Ausdruck, aber dein Beispiel scheint falsch, nach einem performance-test: stackoverflow.com/questions/180986/...InformationsquelleAutor nosklo
search
⇒ etwas finden überall in der Zeichenfolge und zurück ein match-Objekt.match
⇒ fündig bei der Anfang des Strings zurückgeben, die ein match-Objekt.InformationsquelleAutor Dhanasekaran Anbalagan
re.search
Suchees für das Muster gesamten string, in der Erwägung, dassre.match
hat die Suche nicht das Muster; wenn es nicht, es hat keine andere Wahl, als zu match es am Anfang der Zeichenfolge.fullmatch
in phyton 3.4)?InformationsquelleAutor xilun
Der Unterschied ist,
re.match()
in die Irre führt jemand gewohnt Perl, grep, oder sed reguläre Ausdrücke, undre.search()
nicht. 🙂Mehr nüchtern, Als John D. Cook Bemerkungen,
re.match()
"verhält sich so, als wenn jedes Muster hat ^ vorangestellt." In anderen Worten,re.match('pattern')
gleichre.search('^pattern')
. So ist es ein Anker-Muster der linken Seite. Aber auch nicht-Anker-Muster - Rechte Seite: das erfordert noch eine abschließende$
.Ehrlich gesagt angesichts der oben genannten, ich denke
re.match()
werden sollte, abgelehnt. Ich wäre daran interessiert zu wissen, Gründen Sie beibehalten werden soll.InformationsquelleAutor CODE-REaD
können Sie sich das folgende Beispiel zu verstehen, die Arbeit der re.match und re.Suche
re.match zurückkehren wird keiner, aber neu.suchen, zurück abc.
InformationsquelleAutor ldR
Dieser Kommentar von @ivan_bilan unter die akzeptierte Antwort oben mir denken, wenn solche hack ist eigentlich die Beschleunigung etwas nach oben, so lasst uns herausfinden, wie viele Tonnen von Leistung, die Sie wirklich gewinnen.
Bereitete ich die folgenden test-suite:
Ich aus 10 Messungen (1M, 2M, ..., 10M Worte) der gab mir folgenden plot:
Die daraus resultierenden Linien sind erstaunlich (eigentlich nicht überraschend) gerade. Und die
search
Funktion ist (etwas) schneller angesichts dieses spezifische Muster-Kombination. Die moral von diesem test: Vermeiden overoptimizing code.In der Tat der Kommentar von @ivan_bilan falsch aussieht, aber die
match
Funktion ist immer noch schneller als diesearch
Funktion, wenn Sie vergleichen die gleichen regulären Ausdruck. Können Sie in Ihrem Skript durch Vergleichre.search('^python', word)
zure.match('python', word)
(oderre.match('^python', word)
das ist das gleiche, aber einfacher zu verstehen, wenn Sie nicht Lesen Sie die Dokumentation und scheint nicht auf die Leistung)Ich bin nicht einverstanden mit der Aussage, dass die
match
Funktion ist in der Regel schneller. Diematch
ist schneller, wenn Sie wollen, suchen Anfang der string, dersearch
ist schneller, wenn Sie wollen, suchen Sie überall die Zeichenfolge. Das entspricht dem gesunden Menschenverstand. Das ist der Grund, warum @ivan_bilan falsch war - er verwendetmatch
Suche in der gesamten Zeichenfolge. Das ist, warum Sie Recht haben - Sie verwendetmatch
zu Suche am Anfang der Zeichenfolge. Wenn Sie nicht einverstanden mit mir, versuchen zu finden, regex fürmatch
schneller ist alsre.search('python', word)
und macht die gleiche Arbeit.Auch, wie eine Fußnote, die
re.match('python')
ist geringfügig schneller alsre.match('^python')
. So muss es sein.ja, dass ist es, was ich meinte,
match
- Funktion ist ein bisschen schneller, wenn Sie wollen zu Suche am Anfang der Zeichenfolge (im Vergleich zusearch
Funktion, um ein Wort am Anfang einer Zeichenfolge mitre.search('^python', word)
zum Beispiel). Aber ich finde das komisch, wenn Sie sagen, diesearch
- Funktion für die Suche auf den Anfang eines Strings, sollte es so schnell wie diematch
Funktion.InformationsquelleAutor Jeyekomon
re.match versucht ein Muster am Anfang der Zeichenfolge. re.Suche versucht, die Muster gesamten string, bis es eine übereinstimmung findet.
InformationsquelleAutor cschol
Viel kürzer:
search
durchsucht Trog ganzen string.match
Tut nur der Anfang der Zeichenkette.Folgenden Ex sagt es:
InformationsquelleAutor U9-Forward