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
match
vez de mais geral,search
então? é por velocidade?match
? É uma manobra inteligente para propagar as APIs com nomes não intuitivos para me forçar a ler a documentação? Eu ainda não vou fazer isso! Rebelde!match
parece um pouco mais dofaster
que pesquisar ao usar a mesma expressão regular, mas o seu exemplo parece errado de acordo com um teste de desempenho: stackoverflow.com/questions/180986/…search
⇒ encontre algo em qualquer lugar da string e retorne um objeto correspondente.match
⇒ encontre algo no início da string e retorne um objeto correspondente.fonte
re.search
procurar es para o padrão em toda a corda , enquantore.match
se não procurar o padrão; caso contrário, não terá outra opção senão combiná- lo no início da string.fonte
fullmatch
no phyton 3.4)?Este comentário de @ivan_bilan sob a resposta aceita acima me fez pensar se esse hack realmente está acelerando alguma coisa, então vamos descobrir quantas toneladas de desempenho você realmente obterá.
Eu preparei o seguinte conjunto de testes:
Fiz 10 medições (1M, 2M, ..., 10M palavras), o que me deu o seguinte gráfico:
As linhas resultantes são surpreendentemente (na verdade, não surpreendentemente) retas. E a
search
função é (ligeiramente) mais rápida, dada essa combinação de padrões específicos. A moral desse teste: evite otimizar demais o código.fonte
match
função ainda é mais rápida que asearch
função se você comparar a mesma expressão regular. Você pode verificar no seu script, comparandore.search('^python', word)
are.match('python', word)
(oure.match('^python', word)
o que é o mesmo, mas mais fácil de entender se você não ler a documentação e parece não afetar o desempenho)match
função geralmente é mais rápida. Quantomatch
mais rápido você deseja pesquisar no início da string,search
mais rápido quando você deseja pesquisar por toda a string. O que corresponde ao senso comum. É por isso que @ivan_bilan estava errado - ele costumavamatch
pesquisar por toda a string. É por isso que você está certo - você costumavamatch
pesquisar no início da string. Se você não concorda comigo, tente encontrar regex, poismatch
isso é mais rápidore.search('python', word)
e faz o mesmo trabalho.re.match('python')
é marginalmente mais rápido quere.match('^python')
. Tem que ser.match
função é um pouco mais rápida se você deseja pesquisar no início de uma string (em comparação com o uso dasearch
função para encontrar uma palavra no início de uma string,re.search('^python', word)
por exemplo). Mas acho isso estranho, se você disser àsearch
função para pesquisar no início de uma string, ela deve ser tão rápida quanto amatch
função.Você pode consultar o exemplo abaixo para entender o funcionamento
re.match
e a pesquisa.re.match
retornaránone
, masre.search
retornaráabc
.fonte
A diferença é que
re.match()
engana qualquer pessoa acostumada à correspondência de expressões regulares Perl , grep ou sed , ere.search()
não o faz. :-)Mais sobriamente, como observa John D. Cook ,
re.match()
"comporta-se como se todo padrão tivesse sido precedido". Em outras palavras,re.match('pattern')
é igualre.search('^pattern')
. Por isso, ancora o lado esquerdo de um padrão. Mas também não ancora o lado direito de um padrão: isso ainda requer uma terminação$
.Sinceramente, considerando o exposto, acho que
re.match()
deveria ser preterido. Eu estaria interessado em saber as razões pelas quais ele deveria ser mantido.fonte
re.match tenta corresponder a um padrão no início da string . re.search tenta corresponder o padrão em toda a sequência até encontrar uma correspondência.
fonte
Muito mais curto:
search
varre toda a cadeia.match
varre apenas o início da string.Seguindo Ex diz:
fonte