2014-09-03 5 views
5

docs Il Python per findall() e finditer() stato che:Perché Python findall() e finditer() restituiscono corrispondenze vuote su ricerche non mantenute. *?

corrispondenze vuote vengono incluse nel risultato a meno che non toccano la inizio di un'altra partita

Questo può essere dimostrato come segue:

In [20]: [m.span() for m in re.finditer('.*', 'test')] 
Out[20]: [(0, 4), (4, 4)] 

Qualcuno può dirmi comunque, perché questo schema restituisce una corrispondenza vuota in primo luogo? Non dovrebbe .* consumare l'intera stringa e restituire una singola corrispondenza? E inoltre, perché non c'è nessuna corrispondenza vuota alla fine se ancoro il pattern all'inizio della stringa? per esempio.

In [22]: [m.span() for m in re.finditer('^.*', 'test')] 
Out[22]: [(0, 4)] 
+2

In che modo un modello di ancoraggio iniziale * mai * corrisponde a qualcosa alla fine? –

+0

È un punto giusto. – Vortura

risposta

8
  1. .* è zero o più, quindi una volta i quattro caratteri vengono consumati, la lunghezza zero stringa vuota alla fine (che non tocca l'inizio di ogni partita) rimane; e
  2. La stringa vuota alla fine non corrisponde al modello - non si avvia all'inizio della stringa.
+3

Esattamente, prova con '. +' – OregonTrail

+0

Aha! Sembra tutto così ovvio ora. Grazie mille! – Vortura

Problemi correlati