2014-10-14 11 views
5

devo sottostante Codice:Regular risultato dell'espressione

import re 

line = "78349999234"; 

searchObj = re.search(r'9*', line) 

if searchObj: 
    print "searchObj.group() : ", searchObj.group() 
else: 
    print "Nothing found!!" 

Tuttavia l'uscita è vuota. Pensavo che * significasse: Fa sì che l'RE risultante corrisponda a 0 o più ripetizioni del RE precedente, quante più ripetizioni possibili. ab* corrisponderà a ‘a’, ‘ab’ o ‘a’ seguito da qualsiasi numero di ‘b’ s. Perché non riesco a vedere alcun risultato in questo caso?

+0

Perché hai incollato uno screenshot della tua domanda nella tua domanda? Questo non ha nulla a che fare con questa domanda. Se hai una domanda su StackOverflow, pubblicala su [Meta StackOverflow] (http://meta.stackoverflow.com/), non nel mezzo di una domanda non correlata qui. – abarnert

risposta

5

Penso che l'espressione regolare corrisponda a da sinistra a destra. Quindi il primo motivo che corrisponde è la stringa vuota prima di 7.... Se trova uno 9, lo abbinerà davvero all'avidità: e prova a "mangia" (è la terminologia corretta) il maggior numero di caratteri possibile.

Se si interroga per:

>>> print(re.findall(r'9*',line)); 
['', '', '', '', '9999', '', '', '', ''] 

Si abbina tutte le stringhe vuote tra i personaggi e come si può vedere, 9999 è abbinato pure.

Il motivo principale è probabilmente la prestazione: se cerchi un pattern in una stringa di 10M + caratteri, sei molto felice se il pattern è già nei primi 10k caratteri. Non si vuole sprecare sforzi sulla ricerca del "più bello " match ...


EDIT

Con 0 o più verificarsi uno dei mezzi del gruppo (in questo caso 9) viene ripetuto zero o più volte. In una stringa vuota, i caratteri vengono ripetuti esattamente 0 volte. Se si desidera far corrispondere i modelli in cui i personaggi si ripete una o più volte, è necessario utilizzare

9+ 

Questo si traduce in:

>>> print(re.search(r'9+', line)); 
<_sre.SRE_Match object; span=(4, 8), match='9999'> 

re.search per un modello che accetta la stringa vuota, è probabilmente non è molto utile poiché corrisponderà sempre alla stringa vuota prima dello l'inizio effettivo della stringa.

+0

Grazie, Cosa si intende per 0 o più occorrenze? E non sono in grado di vedere la tendenza allo stackoverflow in questi giorni. Sembra sfocato. Qualche ragione per quello? – user3369157

+0

La risposta non spiega la correzione che l'OP probabilmente vuole: '9 +' invece di '9 *'. – abarnert

+0

@abarnert: modificato ... –

1

Il motivo principale è, la funzione re.search interrompe la ricerca di stringhe una volta trovata una corrispondenza. 9* significa corrispondere alla cifra 9 zero o più volte. Poiché esiste una stringa vuota prima di ogni singolo carattere, la funzione interrompe la ricerca dopo aver trovato la prima stringa vuota. Ecco perché hai ottenuto una stringa vuota come output ...

Problemi correlati