2014-06-20 16 views
10

Desidero un'espressione regolare che corrisponda a qualsiasi serie di cifre, con un possibile punto. Se c'è un altro punto e più cifre dopo di esso, fare una corrispondenza sovrapposta con le cifre precedenti, il punto e le seguenti cifre.
esempio stringa = 'aa323aa232.02.03.23.99aa87..0.111111.mm'
risultati desiderati = [323, 232.02, 02.03, 03.23, 23.99, 87, 0.111111]Espressione regolare sovrapposta

attualmente utilizzando:

import re 
i = 'aa323aa232.02.03.23.99aa87..0.111111.mm' 
matches = re.findall(r'(?=(\d+\.{0,1}\d+))', i) 
print matches 

uscita:

['323', '23', '232.02', '32.02', '2.02', '02.03', '2.03', '03.23', '3.23', '23.99', '3.99', '99', '87', '0.111111', '111111', '11111', '1111', '111', '11'] 
+1

è '99' non un risultato di per sé? – hwnd

risposta

10

Questo utilizza un'asserzione lookahead per la cattura, e poi un altro espressione per g obbling personaggi con le regole:

>>> import re 
>>> i = 'aa323aa232.02.03.23.99aa87..0.111111.mm' 
>>> re.findall(r'(?=(\d+(?:\.\d+)?))\d+(?:\.\d+(?!\.?\d))?', i) 

uscita

['323', '232.02', '02.03', '03.23', '23.99', '87', '0.111111'] 
+5

+1 - In particolare, la soluzione Python sarebbe 're.findall ('(? = (\ D + (?: \. \ D +)?)) \ D + (?: \. \ D + (?! \.? \ d))? ', i) 'dove' i' è la stringa. – iCodez

+1

+1 per '\ d' poesia :) – zx81