python sub Qual è la differenza tra re.search e re.match?




use regex python 3 (7)

re.match è ancorato all'inizio della stringa. Questo non ha nulla a che fare con i newline, quindi non è lo stesso che usare ^ nello schema.

Come dice la documentazione di re.match :

Se zero o più caratteri all'inizio della stringa corrispondono al modello di espressione regolare, restituisce un'istanza MatchObject corrispondente. Restituisce None se la stringa non corrisponde al pattern; si noti che questo è diverso da una corrispondenza di lunghezza zero.

Nota: se si desidera individuare una corrispondenza in qualsiasi stringa, utilizzare invece search() .

re.search cerca l'intera stringa, come dice la documentazione :

Scansione attraverso la stringa alla ricerca di una posizione in cui il modello di espressioni regolari produce una corrispondenza e restituisce un'istanza MatchObject corrispondente. Restituisce None se nessuna posizione nella stringa corrisponde al pattern; si noti che questo è diverso dal trovare una corrispondenza di lunghezza zero in qualche punto della stringa.

Quindi, se è necessario abbinare all'inizio della stringa, o per abbinare l'intera stringa usa match . È più veloce Altrimenti usa la search .

La documentazione ha una sezione specifica per la match e la search che copre anche le stringhe multilinea:

Python offre due diverse operazioni primitive basate su espressioni regolari: i controlli di match per una corrispondenza solo all'inizio della stringa, mentre la search controlla una corrispondenza in qualsiasi punto della stringa (questo è ciò che Perl fa per impostazione predefinita).

Si noti che la match può essere diversa dalla search anche quando si utilizza un'espressione regolare che inizia con '^' : '^' corrisponde solo all'inizio della stringa, o in modalità MULTILINE anche immediatamente dopo una nuova riga. L'operazione " match " ha esito positivo solo se il pattern coincide all'inizio della stringa indipendentemente dalla modalità, o nella posizione di partenza data dall'argomento pos opzionale, indipendentemente dal fatto che una nuova riga lo preceda.

Ora, basta parlare. È tempo di vedere qualche codice di esempio:

# 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

Qual è la differenza tra le funzioni search() e match() nel modulo re Python ?

Ho letto la documentation (la documentation attuale ), ma non mi sembra mai di ricordarla. Continuo a cercarlo e ri-impararlo. Spero che qualcuno risponda chiaramente con degli esempi in modo che (forse) rimarrà nella mia testa. O almeno avrò un posto migliore in cui tornare con la mia domanda e ci vorrà meno tempo per ri-apprenderlo.


search ⇒ trova qualcosa da qualche parte nella stringa e restituisci un oggetto partita.

match ⇒ trova qualcosa all'inizio della stringa e restituisce un oggetto match.


puoi fare riferimento all'esempio seguente per comprendere il funzionamento di re.match e re.search

a = "123abc"
t = re.match("[a-z]+",a)
t = re.search("[a-z]+",a)

re.match non restituirà nessuno, ma re.search restituirà abc.


La differenza è che re.match() inganna chiunque sia abituato alla corrispondenza di espressioni regolari Perl , grep o sed e re.search() no. :-)

Più sobriamente, come osserva John D. Cook , re.match() "si comporta come se ogni schema avesse ^ anteposto". In altre parole, re.match('pattern') uguale a re.search('^pattern') . Quindi fissa il lato sinistro di un modello. Ma non aggiunge ancora il lato destro di un modello: ciò richiede ancora un $ chiusura.

Considerato re.match() quanto sopra, penso che re.match() dovrebbe essere deprecato. Sarei interessato a conoscere i motivi per cui dovrebbe essere mantenuto.


Molto più breve:

  • search scansioni attraverso l'intera stringa.

  • match solo all'inizio della stringa.

Dopo Ex dice:

>>> a = "123abc"
>>> re.match("[a-z]+",a)
None
>>> re.search("[a-z]+",a)
abc

re.match tenta di abbinare un motivo all'inizio della stringa . re.search tenta di far corrispondere il pattern in tutta la stringa finché non trova una corrispondenza.


re.search cerca es per il pattern in tutta la stringa , mentre re.match non cerca il pattern; se non lo fa, non ha altra scelta che combaciare all'inizio della stringa.







match