re.match
закреплен в начале строки. Это не имеет ничего общего с символами новой строки, поэтому это не то же самое, что использование ^
в шаблоне.
Как сказано в документации re.match :
Если ноль или более символов в
начале строки соответствуют шаблону регулярного выражения, вернуть соответствующий MatchObject
экземпляр. Возврат, None
если строка не соответствует шаблону; обратите внимание, что это отличается от совпадения нулевой длины.
Примечание. Если вы хотите найти совпадение в любом месте строки, используйте search()
вместо этого.
re.search
ищет всю строку, как сказано в документации :
Просмотрите строку и найдите место, где шаблон регулярного выражения выдает совпадение, и верните соответствующий MatchObject
экземпляр. Возврат, None
если ни одна позиция в строке не соответствует шаблону; обратите внимание, что это отличается от поиска совпадения нулевой длины в некоторой точке строки.
Поэтому, если вам нужно сопоставить начало строки, или сопоставить всю строку, используйте match
. Это быстрее. В противном случае используйте search
.
В документации есть специальный раздел для match
vs.,search
который также охватывает многострочные строки:
Python предлагает две различные примитивные операции на основе регулярных выражений: match
проверяет совпадение
только в начале строки, а search
проверяет совпадение в
любом месте строки (это то, что Perl делает по умолчанию).
Обратите внимание, что это match
может отличаться search
даже при использовании регулярного выражения, начинающегося с '^'
: '^'
соответствует только в начале строки или в
MULTILINE
режиме, также сразу после новой строки. Операция « match
» завершается успешно, только если шаблон соответствует в начале строки
независимо от режима или в начальной позиции, заданной необязательным pos
аргументом, независимо от того, предшествует ли ему символ новой строки.
Теперь хватит разговоров. Время увидеть пример кода:
# 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