re.match
ist am Anfang der Zeichenfolge verankert. Das hat nichts mit Zeilenumbrüchen zu tun, daher ist es nicht dasselbe wie ^
im Muster.
In der Dokumentation zu re.match heißt es:
Wenn null oder mehr Zeichen am
Anfang der Zeichenfolge mit dem Muster des regulären Ausdrucks übereinstimmen, geben Sie eine entsprechende MatchObject
Instanz zurück. Rückgabe, None
wenn die Zeichenfolge nicht mit dem Muster übereinstimmt; Beachten Sie, dass sich dies von einer Übereinstimmung mit der Länge Null unterscheidet.
Hinweis: Wenn Sie eine Übereinstimmung an einer beliebigen Stelle in der Zeichenfolge suchen möchten, verwenden Sie search()
stattdessen.
re.search
durchsucht die gesamte Zeichenfolge, wie in der Dokumentation angegeben :
Durchsuchen Sie die Zeichenfolge nach einer Stelle, an der das Muster des regulären Ausdrucks eine Übereinstimmung erzeugt, und geben Sie eine entsprechende MatchObject
Instanz zurück. Rückgabe, None
wenn keine Position in der Zeichenfolge mit dem Muster übereinstimmt; Beachten Sie, dass dies anders ist als das Finden einer Übereinstimmung mit der Länge Null an einem bestimmten Punkt in der Zeichenfolge.
Wenn Sie also am Anfang der Zeichenfolge übereinstimmen müssen oder die gesamte Zeichenfolge verwenden möchten, verwenden Sie match
. Es ist schneller. Andernfalls verwenden search
.
Die Dokumentation enthält einen speziellen Abschnitt für match
vs.search
, der auch mehrzeilige Zeichenfolgen abdeckt:
Python bietet zwei verschiedene primitive Operationen basierend auf regulären Ausdrücken: match
prüft , ob ein Spiel
erst am Anfang der Zeichenfolge, während search
prüft , ob ein Spiel
irgendwo im String (das ist , was Perl standardmäßig der Fall ist).
Beachten Sie, dass dies
auch bei Verwendung eines regulären Ausdrucks, der mit : beginnt , match
abweichen kann. Übereinstimmungen nur am Anfang der Zeichenfolge oder im
Modus auch unmittelbar nach einer neuen Zeile. Die Operation " " ist nur erfolgreich, wenn das Muster
unabhängig vom Modus am Anfang der Zeichenfolge oder an der durch das optionale
Argument angegebenen Startposition übereinstimmt, unabhängig davon, ob eine neue Zeile davor steht.search
'^'
'^'
MULTILINE
match
pos
Jetzt genug geredet. Zeit, einen Beispielcode zu sehen:
# example code:
string_with_newlines = """something
someotherthing"""
import re
print re.match('some', string_with_newlines) # matches
print re.match('someother',
string_with_newlines) # won't match
print re.match('^someother', string_with_newlines,
re.MULTILINE) # also won't match
print re.search('someother',
string_with_newlines) # finds something
print re.search('^someother', string_with_newlines,
re.MULTILINE) # also finds something
m = re.compile('thing$', re.MULTILINE)
print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines,
re.MULTILINE) # also matches
match
eher begrenzte als allgemeinere verwendensearch
? ist es für die Geschwindigkeit?match
? Ist es ein kluges Manöver, die APIs mit nicht intuitiven Namen zu versehen, um mich zum Lesen der Dokumentation zu zwingen? Ich werde es immer noch nicht tun! Rebell!match
sieht ein bisschenfaster
wie Suche aus, wenn der gleiche reguläre Ausdruck verwendet wird, aber Ihr Beispiel scheint laut einem Leistungstest falsch zu sein: stackoverflow.com/questions/180986/…search
⇒ Suchen Sie irgendwo in der Zeichenfolge etwas und geben Sie ein Übereinstimmungsobjekt zurück.match
⇒ Suchen Sie etwas am Anfang der Zeichenfolge und geben Sie ein Übereinstimmungsobjekt zurück.quelle
re.search
Such es für das Muster in der gesamten Zeichenfolge , währendre.match
sie nicht sucht das Muster; wenn dies nicht der Fall, es hat keine andere Wahl , als passen es der Zeichenfolge am Anfang.quelle
fullmatch
in Phyton 3.4)?Dieser Kommentar von @ivan_bilan unter der oben akzeptierten Antwort hat mich zum Nachdenken gebracht, ob ein solcher Hack tatsächlich etwas beschleunigt. Lassen Sie uns also herausfinden, wie viele Tonnen Leistung Sie wirklich gewinnen werden.
Ich habe die folgende Testsuite vorbereitet:
Ich habe 10 Messungen durchgeführt (1M, 2M, ..., 10M Wörter), die mir die folgende Darstellung gaben:
Die resultierenden Linien sind überraschend (eigentlich nicht so überraschend) gerade. Und die
search
Funktion ist bei dieser speziellen Musterkombination (etwas) schneller . Die Moral dieses Tests: Vermeiden Sie eine Überoptimierung Ihres Codes.quelle
match
Funktion ist immer noch schneller als diesearch
Funktion, wenn Sie denselben regulären Ausdruck vergleichen. Sie können durch den Vergleich in Ihrem Skript überprüfenre.search('^python', word)
zure.match('python', word)
(oderre.match('^python', word)
was das gleiche , aber leichter zu verstehen , wenn Sie nicht in der Dokumentation lesen Sie und scheint nicht die Leistung zu beeinträchtigen)match
Funktion im Allgemeinen schneller ist. Jematch
schneller Sie suchen, wenn Sie am Anfang der Zeichenfolgesearch
suchen möchten, desto schneller, wenn Sie in der gesamten Zeichenfolge suchen möchten . Welches entspricht dem gesunden Menschenverstand. Deshalb hat sich @ivan_bilan geirrt - er hat immermatch
in der gesamten Zeichenfolge gesucht. Deshalb haben Sie Recht - Sie haben frühermatch
am Anfang der Zeichenfolge gesucht. Wenn Sie mit mir nicht einverstanden sind, versuchen Sie, Regex zu finden, dennmatch
das ist schneller alsre.search('python', word)
und erledigt den gleichen Job.re.match('python')
ist geringfügig schneller alsre.match('^python')
. Es muss sein.match
Funktion ist etwas schneller, wenn Sie am Anfang einer Zeichenfolge suchen möchten (im Vergleich zur Verwendung dersearch
Funktion, um beispielsweise ein Wort am Anfang einer Zeichenfolge zu findenre.search('^python', word)
). Aber ich finde das seltsam. Wenn Sie dersearch
Funktion sagen , dass sie am Anfang eines Strings suchen soll, sollte sie genauso schnell sein wie diematch
Funktion.Sie können sich auf das folgende Beispiel beziehen, um die Funktionsweise
re.match
und Forschung zu verstehenre.match
wird zurückkehrennone
, wird aberre.search
zurückkehrenabc
.quelle
Der Unterschied besteht darin, dass
re.match()
jeder, der an Perl- , Grep- oder Sed- Übereinstimmungen mit regulären Ausdrücken gewöhntre.search()
ist, irregeführt wird und dies nicht tut. :-)Nüchterner, wie John D. Cook bemerkt ,
re.match()
"verhält sich so, als ob jedes Muster vorangestellt wäre." Mit anderen Worten,re.match('pattern')
gleichre.search('^pattern')
. So verankert es die linke Seite eines Musters. Aber es verankert auch nicht die rechte Seite eines Musters: Das erfordert immer noch eine Beendigung$
.Ehrlich gesagt denke ich,
re.match()
sollte veraltet sein. Es würde mich interessieren, warum es beibehalten werden sollte.quelle
re.match versucht, ein Muster am Anfang der Zeichenfolge abzugleichen . re.search versucht, das Muster in der gesamten Zeichenfolge abzugleichen, bis eine Übereinstimmung gefunden wird.
quelle
Viel kürzer:
search
scannt die gesamte Zeichenfolge.match
scannt nur den Anfang der Zeichenfolge.Folgende Ex sagt es:
quelle