2015-04-22 12 views
14

Dalla documentazione, è molto chiaro che:Perché utilizzare re.match(), quando re.search() può fare la stessa cosa?

  • match() -> applicare pattern match all'inizio della stringa
  • search() -> Ricerca attraverso la stringa e tornare prima partita

E search con '^' e senza bandiera re.M funzionerebbe come match.

Allora perché python ha match()? Non è ridondante? Ci sono delle prestazioni vantaggiose per mantenere match() in python?

+1

È una comodità per uno schema comune e rende l'intento più chiaro. – Barmar

+0

Vedere [questa domanda] (https://stackoverflow.com/questions/12803709/re-match-vs-re-search-performance-difference) per i benchmark delle prestazioni. 're.search' in realtà può essere più veloce a volte. – miradulo

+1

possibile duplicato: http://stackoverflow.com/questions/180986/che-è-la-differenza-tra-pythons-re-search-and-re-match –

risposta

4

"perché" le domande sono difficili da rispondere. È un dato di realtà, si potrebbe definire la funzione re.match() in questo modo:

def match(pattern, string, flags): 
    return re.search(r"\A(?:" + pattern + ")", string, flags) 

(perché \A corrisponde sempre all'inizio della stringa, indipendentemente dalla status' re.M bandiera).

Quindi re.match è un collegamento utile ma non strettamente necessario. È particolarmente confuso per i programmatori Java che hanno Pattern.matches() che ancorano la ricerca all'inizio e terminano con della stringa (che è probabilmente un caso d'uso più comune di un semplice ancoraggio all'inizio).

E 'diverso per i match e search metodi di espressione regolare oggetti, anche se, come Eric ha sottolineato.

+1

_ "potresti definire la funzione" _ No non puoi.Questa corrispondenza dà un risultato diverso se usata con l'argomento 'pos' (supponendo che l'abbia inoltrata dove necessario) – Eric

+0

@Eric: Le funzioni a livello di modulo * non hanno un argomento' pos'. Solo i metodi dell'oggetto regex fanno (ecco perché ho citato la tua risposta nell'ultima riga). –

11

L'argomento pos comporta in modo diverso in modo importante:

>>> s = "a ab abc abcd" 
>>> re.compile('a').match(s, pos=2) 
<_sre.SRE_Match object; span=(2, 3), match='a'> 
>>> re.compile('^a').search(s, pos=2) 
None 

match permette di scrivere la tokenizzatore, e garantire che i caratteri non sono mai saltati. search non ha modo di dire "inizia dal carattere meno recente consentito".

utilizzo Esempio di partita per spezzare una stringa senza spazi:

def tokenize(s, patt): 
    at = 0 
    while at < len(s): 
     m = patt.match(s, pos=at) 
     if not m: 
      raise ValueError("Did not expect character at location {}".format(at)) 
     at = m.end() 
     yield m 
+0

Questo può essere vero per le funzioni pattern.match() e pattern.search(). Per la funzione re.match (patn, string, flags = 0), che non ha argomenti 'pos', questa spiegazione non è valida. Come indicato da @Tim, potrebbe essere una scorciatoia utile che non ha bisogno del programmatore per usare '^'. – elephant

+0

@mhr: Sarebbe incoerente se il metodo di corrispondenza mancasse a livello di modulo sebbene – Eric

Problemi correlati