re.match
está 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 MatchObject
instância correspondente . Retorne None
se 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.search
pesquisa 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 MatchObject
instância correspondente . Retorne None
se 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 match
vs.search
que também abrange seqüências de várias linhas:
O Python oferece duas operações primitivas diferentes baseadas em expressões regulares: match
verifica uma correspondência
apenas no início da string, enquanto search
verifica uma correspondência
em qualquer lugar da string (é o que o Perl faz por padrão).
Observe que isso match
pode diferir search
mesmo quando se usa uma expressão regular iniciada por '^'
: '^'
corresponde apenas no início da sequência ou no
MULTILINE
modo também imediatamente após uma nova linha. A match
operaçã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