2013-07-16 20 views
7

Questa è una di quelle cose in cui sono sicuro che mi manca qualcosa di semplice, ma ... Nel seguente programma di esempio, sto cercando di usare la libreria RE di Python per analizzare la stringa " linea "per ottenere il numero a virgola mobile appena prima del segno di percentuale, ovvero" 90,31 ". Ma il codice stampa sempre "nessuna corrispondenza".Espressione regolare Python non corrispondente

Ho provato anche un altro paio di espressioni regolari, tutte con lo stesso risultato. Cosa mi manca?

#!/usr/bin/python 
import re 
line = ' 0 repaired, 90.31% done' 
pct_re = re.compile(' (\d+\.\d+)% done$') 
#pct_re = re.compile(', (.+)% done$') 
#pct_re = re.compile(' (\d+.*)% done$') 
match = pct_re.match(line) 
if match: print 'got match, pct=' + match.group(1) 
else: print 'no match' 
+0

Sapevo che era qualcosa di banale! Grazie a tutti per le risposte veloci e utili. – Matt

risposta

15

match corrisponde solo dal inizio della stringa. Il tuo codice funziona bene se lo fai invece con lo pct_re.search(line).

4

Si dovrebbe usare re.findall invece:

>>> line = ' 0 repaired, 90.31% done' 
>>> 
>>> pattern = re.compile("\d+[.]\d+(?=%)") 
>>> re.findall(pattern, line) 
['90.31'] 

re.match corrisponderà all'inizio della stringa. Quindi avresti bisogno di costruire la regex per la stringa completa.

2

provare questo se si vuole veramente utilizzare la corrispondenza:

re.match(r'.*(\d+\.\d+)% done$', line) 

r '...' è una stringa 'raw' ignorando alcune sequenze di escape, che è una buona pratica da usare con regexp in pitone. - kratenko (vedi commento sotto)

+0

Si potrebbe voler aggiungere che il 'r '...'' è una stringa "raw" che ignora alcune sequenze di escape, che è una buona pratica da usare con regexp in python. – kratenko

Problemi correlati