re.matchestá ancorado no início da string. Isso não tem nada a ver com novas linhas, portanto, não é o mesmo que usar ^no padrão.
Como a documentação re.match diz:
Se zero ou mais caracteres no
início da sequência corresponderem ao padrão de expressão regular, retorne uma MatchObjectinstância correspondente . Retorne Nonese a sequência não corresponder ao padrão; observe que isso é diferente de uma correspondência de comprimento zero.
Nota: Se você deseja localizar uma correspondência em qualquer lugar da string, use search()
.
re.searchpesquisa a cadeia inteira, como diz a documentação :
Examine a cadeia de caracteres procurando um local em que o padrão de expressão regular produz uma correspondência e retorne uma MatchObjectinstância correspondente . Retorne Nonese nenhuma posição na string corresponder ao padrão; observe que isso é diferente de encontrar uma correspondência de comprimento zero em algum momento da string.
Portanto, se você precisar corresponder no início da string ou usar toda a string, use match. É mais rápido. Caso contrário, use search.
A documentação possui uma seção específica para matchvs.search que também abrange seqüências de várias linhas:
O Python oferece duas operações primitivas diferentes baseadas em expressões regulares: matchverifica uma correspondência
apenas no início da string, enquanto searchverifica uma correspondência
em qualquer lugar da string (é o que o Perl faz por padrão).
Observe que isso matchpode diferir search
mesmo quando se usa uma expressão regular iniciada por '^': '^'corresponde apenas no início da sequência ou no
MULTILINEmodo também imediatamente após uma nova linha. A matchoperação " " será bem-sucedida apenas se o padrão corresponder no início da sequência,
independentemente do modo, ou na posição inicial fornecida pelo pos
argumento opcional, independentemente de uma nova linha preceder.
Agora, chega de conversa. Hora de ver algum código de exemplo:
# 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