sub - use regex python 3




Qual è la differenza tra re.search e re.match? (6)

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.


la corrispondenza è molto più veloce della ricerca, quindi invece di fare regex.search ("word") puoi fare regex.match ((. *?) word (. *?)) e guadagnare un sacco di prestazioni se stai lavorando con milioni di campioni.

Questo commento di @ivan_bilan sotto la risposta accettata sopra mi ha fatto pensare se un tale hack sta effettivamente accelerando qualcosa, quindi cerchiamo di scoprire quante tonnellate di prestazioni otterrete davvero.

Ho preparato la seguente suite di test:

import random
import re
import string
import time

LENGTH = 10
LIST_SIZE = 1000000

def generate_word():
    word = [random.choice(string.ascii_lowercase) for _ in range(LENGTH)]
    word = ''.join(word)
    return word

wordlist = [generate_word() for _ in range(LIST_SIZE)]

start = time.time()
[re.search('python', word) for word in wordlist]
print('search:', time.time() - start)

start = time.time()
[re.match('(.*?)python(.*?)', word) for word in wordlist]
print('match:', time.time() - start)

Ho fatto 10 misure (1M, 2M, ..., 10M parole) che mi hanno dato la trama seguente:

Le linee risultanti sono sorprendentemente (in realtà non così sorprendentemente) diritte. E la funzione di search è (leggermente) più veloce data questa combinazione di pattern specifici. La morale di questo test: evitare di ottimizzare il codice.


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.


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.


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.


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.







match