ADDITION TO EDITION 2 of my other answer
(Everything was supposed to last only in one post)
A regular expression pattern defines 4 submatrices, each of which corresponds to a specific type of number. Every time a regular expression matches a part of a string, there is only one of the subpatterns, which corresponds, therefore, to the possibility of using mat.lastindex in a replacement function. The following code shows submatrix matches with different numbers:
import re def float_show(ch, regx = re.compile( '(?<![\d.])' '0*' # potentiel heading zeros '(?:' '(\d+)\.?' # INTEGERS : # ~ pure integers non-0 or 0 # 000450 , 136000 , 87 , 000 , 0 # ~ integer part non-0 + '.' # 0044. , 4100. # ~ integer part 0 + '.' # 000. , 0. # ~ integer part non-0 + '.' + fractional part 0: # 000570.00 , 193.0 , 3.000 '|\.(0)' # SPECIAL CASE, 0 WITH FRACTIONAL PART : # ~ integer part 0 + compulsory fractional part 0: # 000.0, 0.000 , .0 , .00000 '|(\.\d+?)' # FLOATING POINT NUMBER # ~ with integer part 0: # 000.0890 , 0.52 , 0.1 , .077000 , .1400 , .0006010 '|(\d+\.\d+?)' # FLOATING POINT NUMBER # ~ with integer part non-0: # 0024000.013000 , 145.0235 , 3.00058 ')' '0*' # potential tailing zeros '(?![\d.])'), repl = lambda mat: mat.group(mat.lastindex) if mat.lastindex!=3 else '0' + mat.group(3) ): mat = regx.search(ch) if mat: return (ch,regx.sub(repl,ch),repr(mat.groups())) else: return (ch,'No match','No groups') numbers = ['23456000', '23456000.', '23456000.000', '00023456000', '000023456000.', '000023456000.000', '10000', '10000.', '10000.000', '00010000', '00010000.', '00010000.000', '24', '24.', '24.000', '00024', '00024.', '00024.000', '8', '8.', '8.000', '0008', '0008.', '0008.000', '0', '00000', '0.', '000.', '\n', '0.0', '0.000', '000.0', '000.000', '.000000', '.0', '\n', '.00023456', '.00023456000', '.00503', '.00503000', '.068', '.0680000', '.8', '.8000', '.123456123456', '.123456123456000', '.657', '.657000', '.45', '.4500000', '.7', '.70000', '\n', '0.0000023230000', '000.0000023230000', '0.0081000', '0000.0081000', '0.059000', '0000.059000', '0.78987400000', '00000.78987400000', '0.4400000', '00000.4400000', '0.5000', '0000.5000', '0.90', '000.90', '0.7', '000.7', '\n', '2.6', '00002.6', '00002.60000', '4.71', '0004.71', '0004.7100', '23.49', '00023.49', '00023.490000', '103.45', '0000103.45', '0000103.45000', '10003.45067', '000010003.45067', '000010003.4506700', '15000.0012', '000015000.0012', '000015000.0012000', '78000.89', '000078000.89', '000078000.89000', '\n', '.0457e10', '.0457000e10', '0.782e10', '0000.782e10', '0000.7820000e10', '1.23E2', '0001.23E2', '0001.2300000E2', '1.46e10', '0001.46e10', '0001.4600000e10', '1.077e-456', '0001.077e-456', '0001.077000e-456', '1.069e10', '0001.069e10', '0001.069000e10', '105040.03e10', '000105040.03e10', '105040.0300e10', '\n', '..18000', '25..00', '36...77', '2..8', '3.8..9', '.12500.', '12.51.400' ] pat = '%20s %-16s %s' li = [pat % ('tested number ',' shaved float',' regx.search(number).groups()')] li.extend(pat % float_show(ch) if ch!='\n' else '\n' for ch in numbers) print '\n'.join(li)
shows
tested number shaved float regx.search(number).groups() 23456000 23456000 ('23456000', None, None, None) 23456000. 23456000 ('23456000', None, None, None) 23456000.000 23456000 ('23456000', None, None, None) 00023456000 23456000 ('23456000', None, None, None) 000023456000. 23456000 ('23456000', None, None, None) 000023456000.000 23456000 ('23456000', None, None, None) 10000 10000 ('10000', None, None, None) 10000. 10000 ('10000', None, None, None) 10000.000 10000 ('10000', None, None, None) 00010000 10000 ('10000', None, None, None) 00010000. 10000 ('10000', None, None, None) 00010000.000 10000 ('10000', None, None, None) 24 24 ('24', None, None, None) 24. 24 ('24', None, None, None) 24.000 24 ('24', None, None, None) 00024 24 ('24', None, None, None) 00024. 24 ('24', None, None, None) 00024.000 24 ('24', None, None, None) 8 8 ('8', None, None, None) 8. 8 ('8', None, None, None) 8.000 8 ('8', None, None, None) 0008 8 ('8', None, None, None) 0008. 8 ('8', None, None, None) 0008.000 8 ('8', None, None, None) 0 0 ('0', None, None, None) 00000 0 ('0', None, None, None) 0. 0 ('0', None, None, None) 000. 0 ('0', None, None, None) 0.0 0 (None, '0', None, None) 0.000 0 (None, '0', None, None) 000.0 0 (None, '0', None, None) 000.000 0 (None, '0', None, None) .000000 0 (None, '0', None, None) .0 0 (None, '0', None, None) .00023456 0.00023456 (None, None, '.00023456', None) .00023456000 0.00023456 (None, None, '.00023456', None) .00503 0.00503 (None, None, '.00503', None) .00503000 0.00503 (None, None, '.00503', None) .068 0.068 (None, None, '.068', None) .0680000 0.068 (None, None, '.068', None) .8 0.8 (None, None, '.8', None) .8000 0.8 (None, None, '.8', None) .123456123456 0.123456123456 (None, None, '.123456123456', None) .123456123456000 0.123456123456 (None, None, '.123456123456', None) .657 0.657 (None, None, '.657', None) .657000 0.657 (None, None, '.657', None) .45 0.45 (None, None, '.45', None) .4500000 0.45 (None, None, '.45', None) .7 0.7 (None, None, '.7', None) .70000 0.7 (None, None, '.7', None) 0.0000023230000 0.000002323 (None, None, '.000002323', None) 000.0000023230000 0.000002323 (None, None, '.000002323', None) 0.0081000 0.0081 (None, None, '.0081', None) 0000.0081000 0.0081 (None, None, '.0081', None) 0.059000 0.059 (None, None, '.059', None) 0000.059000 0.059 (None, None, '.059', None) 0.78987400000 0.789874 (None, None, '.789874', None) 00000.78987400000 0.789874 (None, None, '.789874', None) 0.4400000 0.44 (None, None, '.44', None) 00000.4400000 0.44 (None, None, '.44', None) 0.5000 0.5 (None, None, '.5', None) 0000.5000 0.5 (None, None, '.5', None) 0.90 0.9 (None, None, '.9', None) 000.90 0.9 (None, None, '.9', None) 0.7 0.7 (None, None, '.7', None) 000.7 0.7 (None, None, '.7', None) 2.6 2.6 (None, None, None, '2.6') 00002.6 2.6 (None, None, None, '2.6') 00002.60000 2.6 (None, None, None, '2.6') 4.71 4.71 (None, None, None, '4.71') 0004.71 4.71 (None, None, None, '4.71') 0004.7100 4.71 (None, None, None, '4.71') 23.49 23.49 (None, None, None, '23.49') 00023.49 23.49 (None, None, None, '23.49') 00023.490000 23.49 (None, None, None, '23.49') 103.45 103.45 (None, None, None, '103.45') 0000103.45 103.45 (None, None, None, '103.45') 0000103.45000 103.45 (None, None, None, '103.45') 10003.45067 10003.45067 (None, None, None, '10003.45067') 000010003.45067 10003.45067 (None, None, None, '10003.45067') 000010003.4506700 10003.45067 (None, None, None, '10003.45067') 15000.0012 15000.0012 (None, None, None, '15000.0012') 000015000.0012 15000.0012 (None, None, None, '15000.0012') 000015000.0012000 15000.0012 (None, None, None, '15000.0012') 78000.89 78000.89 (None, None, None, '78000.89') 000078000.89 78000.89 (None, None, None, '78000.89') 000078000.89000 78000.89 (None, None, None, '78000.89') .0457e10 0.0457e10 (None, None, '.0457', None) .0457000e10 0.0457e10 (None, None, '.0457', None) 0.782e10 0.782e10 (None, None, '.782', None) 0000.782e10 0.782e10 (None, None, '.782', None) 0000.7820000e10 0.782e10 (None, None, '.782', None) 1.23E2 1.23E2 (None, None, None, '1.23') 0001.23E2 1.23E2 (None, None, None, '1.23') 0001.2300000E2 1.23E2 (None, None, None, '1.23') 1.46e10 1.46e10 (None, None, None, '1.46') 0001.46e10 1.46e10 (None, None, None, '1.46') 0001.4600000e10 1.46e10 (None, None, None, '1.46') 1.077e-456 1.077e-456 (None, None, None, '1.077') 0001.077e-456 1.077e-456 (None, None, None, '1.077') 0001.077000e-456 1.077e-456 (None, None, None, '1.077') 1.069e10 1.069e10 (None, None, None, '1.069') 0001.069e10 1.069e10 (None, None, None, '1.069') 0001.069000e10 1.069e10 (None, None, None, '1.069') 105040.03e10 105040.03e10 (None, None, None, '105040.03') 000105040.03e10 105040.03e10 (None, None, None, '105040.03') 105040.0300e10 105040.03e10 (None, None, None, '105040.03') ..18000 No match No groups 25..00 No match No groups 36...77 No match No groups 2..8 No match No groups 3.8..9 No match No groups .12500. No match No groups 12.51.400 No match No groups