2015-03-12 14 views
6

Ich weiß, dieses Thema wurde schon diskutiert multipletimes hier auf StackOverflow, aber ich bin auf der Suche nach einer besseren Antwort.Warum haben re.match()?

Während ich die differences schätzen, ich war nicht wirklich in der Lage eine definitive Erklärung warum das re Modul in Python sowohl match() und search() bietet zu finden. Konnte ich nicht das gleiche Verhalten mit search() erhalten, wenn ich ^ im Einzelzeilenmodus und /A im Mehrzeilenmodus voranstellen? Fehle ich etwas?

Ich habe versucht, die Umsetzung Blick auf die _sre.c Code zu verstehen, und ich verstehe, dass die Suche (sre_search()) tatsächlich umgesetzt wird, um den Zeiger in der Zeichenfolge Bewegen des sre_match() auf sie gesucht werden, und die Anwendung, bis eine Übereinstimmung gefunden wird.

Also ich denke, dass die re.match() Verwendung könnte als die entsprechenden regulären Ausdruck etwas schneller (mit ^ oder /A) mit dem re.search(). Ist das der Grund?

Ich recherchierte auch die Python-Dev-ML-Archive, aber ohne Erfolg.

>>> string="""first line 
... second line""" 
>>> print re.match('first', string, re.MULTILINE) 
<_sre.SRE_Match object at 0x1072ae7e8> 
>>> print re.match('second', string, re.MULTILINE) 
None 
>>> print re.search('\Afirst', string, re.MULTILINE) 
<_sre.SRE_Match object at 0x1072ae7e8> 
>>> print re.search('\Asecond', string, re.MULTILINE) 
None 
+0

Ein schneller Versuch schlägt tatsächlich vor, dass "Übereinstimmung" langsamer ist: http://pastebin.com/VABXxY3H – Evpok

+0

@vks nein, 're.match (r '[\ s \ S] *'," foo \ nbar ") .group() ' –

+1

@AvinashRaj' Beachten Sie, dass re.match() auch im MULTILINE-Modus nur am Anfang der Zeichenfolge und nicht am Anfang jeder Zeile passt. https://docs.python.org /2/library/re.html – vks

Antwort

3

Wie Sie bereits wissen, re.match wird erst zu Beginn der Zeichenfolge das Muster testen und re.search prüfen alle Zeichenfolge, bis es eine Übereinstimmung finden.

Also, gibt es einen Unterschied zwischen re.match('toto', s) und re.search('^toto', s) und was ist das?

Werfen wir einen kleinen Test machen:

#!/usr/bin/python 

import time 
import re 

p1 = re.compile(r'toto') 
p2 = re.compile(r'^toto') 

ssize = 1000 

s1 = 'toto abcdefghijklmnopqrstuvwxyz'*ssize 
s2 = 'titi abcdefghijklmnopqrstuvwxyz'*ssize 

nb = 1000 

i = 0 
t0 = time.time() 
while i < nb: 
    p1.match(s1) 
    i += 1 
t1 = time.time() 

i = 0 
t2 = time.time() 
while i < nb: 
    p2.search(s1) 
    i += 1 
t3 = time.time() 

print "\nsucceed\nmatch:" 
print (t1-t0) 
print "search:" 
print (t3-t2) 


i = 0 
t0 = time.time() 
while i < nb: 
    p1.match(s2) 
    i += 1 
t1 = time.time() 

i = 0 
t2 = time.time() 
while i < nb: 
    p2.search(s2) 
    i += 1 
t3 = time.time() 

print "\nfail\nmatch:" 
print (t1-t0) 
print "search:" 
print (t3-t2) 

Die beiden Wege sind mit einem String getestet, die nicht und eine Zeichenfolge übereinstimmt, übereinstimmt.

Ergebnisse:

succeed 
match: 
0.000469207763672 
search: 
0.000494003295898 

fail 
match: 
0.000430107116699 
search: 
0.46605682373 

Was können wir mit diesen Ergebnissen folgern:

1) Die Leistungen sind ähnlich, wenn das Muster

2) Die Leistungen gelingt es ganz anders sind, wenn das Muster nicht . Dies ist der wichtigste Punkt, denn es bedeutet, dass re.search weiterhin jede Position der Zeichenfolge prüft, selbst wenn das Muster verankert ist, wenn re.match sofort stoppt.

Wenn Sie die Größe der fehlgeschlagenen Testzeichenfolge erhöhen, sehen Sie, dass re.match nicht mehr dauert, aber re.search hängt von der Stringgröße ab.

+0

haben kannst. Das ist interessant. Ich habe sowohl mit 2.7 als auch mit 3.4 versucht und das Verhalten ist das, das Sie beschrieben haben. Jetzt bin ich auch neugieriger, ich werde ein bisschen mehr hinein graben, d. H. Die Implementierung besser betrachten. – spider

+0

@Spider: Ich bin nicht sicher, dass dies Ihnen mehr Dinge aufdecken wird, zumal es eine lineare Beziehung zwischen der Zeit und der fehlerhaften String-Größe mit der 're.search'-Methode gibt, wenn die Zeit mit der' re konstant ist .match' Methode. –

+0

Casimir Ich meine, dass ich neugierig bin, die Unterschiede in den beiden Implementierungen zu verstehen. Um mein Wissen zu verbessern. Ich habe deine Antwort angenommen, übrigens. – spider

Verwandte Themen