re.match
wird am Anfang der Zeichenkette verankert. Das hat nichts mit Zeilenumbrüchen zu tun, ist also nicht dasselbe wie die Verwendung von ^
in dem Muster.
Da die re.match Dokumentation sagt:
Wenn null oder mehr Zeichen an der Anfang der Zeichenkette mit dem Muster des regulären Ausdrucks übereinstimmen, geben eine entsprechende MatchObject
Instanz. Rückgabe None
wenn die Zeichenkette nicht dem Muster entspricht; beachten Sie, dass dies eine sich von einer Null-Längen-Übereinstimmung unterscheidet.
Hinweis: Wenn Sie eine Übereinstimmung suchen wollen irgendwo in der Zeichenkette suchen wollen, verwenden Sie search()
stattdessen.
re.search
durchsucht die gesamte Zeichenkette, während In der Dokumentation heißt es :
String durchsuchen auf der Suche nach einem Stelle, an der der reguläre Ausdruck Muster eine Übereinstimmung ergibt, und gibt eine entsprechende MatchObject
Instanz. Rückgabe None
wenn keine Position im Zeichenfolge mit dem Muster übereinstimmt; beachten Sie, dass dies etwas anderes ist als das Finden einer Null-Längen-Übereinstimmung an einer Stelle in der Zeichenfolge.
Wenn Sie also eine Übereinstimmung am Anfang der Zeichenkette benötigen oder die gesamte Zeichenkette abgleichen möchten, verwenden Sie match
. Das ist schneller. Ansonsten verwenden search
.
Die Dokumentation enthält eine spezifischer Abschnitt für match
vs. search
die auch mehrzeilige Zeichenfolgen abdeckt:
Python bietet zwei verschiedene primitive Operationen, die auf regulären Ausdrücken: match
sucht nach einer Übereinstimmung nur am Anfang der Zeichenkette, während search
sucht nach einer Übereinstimmung überall in der Zeichenkette (das ist das, was Perl standardmäßig macht).
Beachten Sie, dass match
kann abweichen von search
auch bei Verwendung eines regulären Ausdrucks der mit '^'
: '^'
passt nur am Anfang der Zeichenkette, oder in MULTILINE
Modus auch sofort nach einem Zeilenumbruch. Die " match
" Operation gelingt nur, wenn das Muster mit der Start der Zeichenkette unabhängig vom Modus, oder beim Start Position, die durch den optionalen Parameter pos
Argument unabhängig davon, ob ein Zeilenumbruch vorausgeht.
So, genug geredet. Es ist Zeit für ein paar Beispielcodes:
# 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