re.match
jest zakotwiczony na początku łańcucha. Nie ma to nic wspólnego z nowymi liniami, więc nie jest to to samo, co używanie ^
we wzorcu.
Jak mówi dokumentacja re.match :
Jeśli zero lub więcej znaków na
początku łańcucha pasuje do wzorca wyrażenia regularnego, zwróć odpowiednią MatchObject
instancję. Zwraca, None
jeśli ciąg nie pasuje do wzorca; zauważ, że różni się to od dopasowania o zerowej długości.
Uwaga: jeśli chcesz znaleźć dopasowanie w dowolnym miejscu ciągu, użyj search()
zamiast niego.
re.search
przeszukuje cały ciąg, jak głosi dokumentacja :
Przeszukaj ciąg znaków w poszukiwaniu lokalizacji, w której wzorzec wyrażenia regularnego tworzy dopasowanie, i zwróć odpowiednią MatchObject
instancję. Zwraca, None
jeśli żadna pozycja w ciągu nie pasuje do wzorca; zauważ, że różni się to od znalezienia dopasowania o zerowej długości w pewnym momencie ciągu.
Więc jeśli potrzebujesz dopasować na początku ciągu lub dopasować cały ciąg, użyj match
. To jest szybsze. W przeciwnym razie użyj search
.
Dokumentacja zawiera konkretną sekcję dla match
vs,search
która obejmuje również ciągi wielowierszowe:
Python oferuje dwie różne prymitywne operacje oparte na wyrażeniach regularnych: match
sprawdza dopasowanie
tylko na początku łańcucha, podczas gdy search
sprawdza dopasowanie w
dowolnym miejscu łańcucha (domyślnie robi to Perl).
Zauważ, że match
może się różnić od search
nawet gdy używasz wyrażenia regularnego rozpoczynającego się od '^'
: '^'
dopasowuje tylko na początku łańcucha, lub w
MULTILINE
trybie również bezpośrednio po nowej linii. Operacja „ match
” kończy się powodzeniem tylko wtedy, gdy wzorzec pasuje na początku łańcucha,
niezależnie od trybu, lub w pozycji początkowej podanej przez opcjonalny pos
argument, niezależnie od tego, czy poprzedza go nowa linia.
Teraz dość gadania. Czas zobaczyć przykładowy kod:
# 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