2015-04-13 15 views
5

Mi scuso per una domanda completamente nuova. Ho provato a cercare StackOverflow prima di pubblicare questa domanda.

Sto cercando di imparare regex utilizzando python da diveintopython3.net. Mentre giocherellare con gli esempi, non sono riuscito a capire una particolare uscita per una ricerca regex (vedi sotto):

>>> pattern = 'M?M?M?$' 

>>> re.search(pattern,'MMMMmmmmm') 
<_sre.SRE_Match object at 0x7f0aa8095168> 

Perché il modello di espressione regolare sopra corrisponde al testo di input? La mia comprensione è che il carattere $ deve corrispondere solo alla fine della stringa. Ma il testo di input termina con 'mmmm'. Quindi, anche se i modelli non dovrebbero corrispondere.

La mia versione pitone è:

Python 3.3.2 (default, Dec 4 2014, 12:49:00) 
[GCC 4.8.3 20140911 (Red Hat 4.8.3-7)] on linux 

EDIT: In allegato uno screenshot da Debuggex. enter image description here

risposta

8

Perché il modello di regex di cui sopra corrisponde al testo di input?

Perché hai reso il precedente M come facoltativo. M? fa riferimento a M facoltativo. M potrebbe o potrebbe non essere presente. Pertanto, la regex precedente 'M?M?M?$' corrisponde solo alla fine della larghezza zero del limite della linea. Quindi hai una corrispondenza.

3

È perché tutti i simboli M sono facoltativi e $ (l'unico simbolo richiesto in questa espressione regolare) corrisponde alla fine. Hai un'espressione regolare uguale a zero-length assertion, che non cattura caratteri ma continua a esserci corrispondenze.

Ecco una visualizzazione:

M?M?M?$ 

Regular expression visualization

Debuggex Demo

+0

Grazie @stribizhev. La demo di Debuggex per lo stesso modello e il testo di input mostra "Non corrisponde" per python. Ho allegato uno screenshot dello stesso nel post originale. Potresti aiutarmi a capire perché questo sta accadendo? –

+0

È possibile spostare il cursore in qualsiasi posizione per verificare se la corrispondenza appare in quella stessa posizione. Poiché la partita è alla fine, il triangolo all'inizio di una stringa non mostra alcuna corrispondenza. È solo per il debug, per mostrare più interni di corrispondenza. –