2015-08-19 13 views
5

Ho cercato di insegnare a me stesso Python e sono attualmente in espressioni regolari. Il testo didattico che ho usato sembra essere finalizzato all'insegnamento di Perl o di qualche altro linguaggio che non sia Python, quindi ho dovuto adattare le espressioni un po 'per adattarsi a Python. Non sono molto esperto, tuttavia, e ho avuto un problema a cercare di far funzionare un'espressione.regex Python restituisce una parte della corrispondenza quando viene utilizzato con re.findall

Il problema riguarda la ricerca di un testo per istanze di prezzi, espresso senza decimali, $ 500 o con decimali, $ 500.10.

Questo è ciò che il testo raccomanda:

\$[0-9]+(\.[0-9][0-9])? 

Replicare il testo, io uso questo codice:

import re 

inputstring = "$500.01" 

result = re.findall(r'\$[0-9]+(\.[0-9][0-9])?', inputstring) 

if result: 
    print(result) 
else: 
    print("No match.") 

Tuttavia, il risultato non è $ 500,01, ma piuttosto:

.01 

Lo trovo strano. Se rimuovo le parentesi e la parte decimale facoltativa, funziona correttamente. Quindi, utilizzando questo:

\$[0-9]+\.[0-9][0-9] 

ottengo:

$500.01 

Come posso ottenere l'espressione regolare per restituire i valori con e senza parti decimali?

Grazie.

+0

Ora ** questa ** è una buona domanda sulle espressioni regolari. –

+0

Jordan H. benvenuto in SO. È davvero bello vedere un utente nel suo primo giorno di postare una domanda che mostra uno sforzo di ricerca, è ben formulato e soddisfa le linee guida SO. – cezar

risposta

4

Utilizzare un gruppo non-cattura:

result = re.findall(r'\$[0-9]+(?:\.[0-9][0-9])?', inputstring) 
           ^^ 

La funzione re.findall restituisce la lista dei testi acquisiti se ce ne sono definiti nel modello, e si dispone di uno nella vostra. Devi liberartene trasformandolo in un non catturante.

re.findall (pattern, string, flags = 0)
Se uno o più gruppi sono presenti nel modello, restituiscono un elenco di gruppi; questo sarà un elenco di tuple se il modello ha più di un gruppo.

Aggiornamento

È possibile abbreviare il regex un po 'utilizzando un quantificatore limitare{2} che richiede esattamente 2 occorrenze della sotto-regola precedente:

r'\$[0-9]+(?:\.[0-9]{2})?' 
        ^^^ 

o addirittura sostituire [0-9] con \d:

r'\$\d+(?:\.\d{2})?' 
+0

Sostituire anche '[0-9] [0-9]', che sembra ridondante, a '[0-9] {2}' poiché ci dovrebbero essere sempre due decimali nel prezzo, se presenti. – cezar

+0

Stavo pensando allo stesso riguardo alla tua ultima modifica. Purtroppo non posso andare avanti più di una volta. – cezar

+1

Il tuo suggerimento ha funzionato. Inoltre, sono nuovo nello stackoverflow e mi rendo conto che il testo nella casella dei commenti dice di non usare questa casella per dire grazie, ma non so in quale altro modo esprimere la mia gratitudine su questo sito, quindi sono lo dirò comunque. Grazie. –

Problemi correlati