2010-06-23 21 views
7

Tengo muchas cadenas de estilo de dirección y quiero ordenarlas de una manera racional.Cómo rellenar todos los números en una cadena

Estoy buscando rellenar todos los números en una cadena de modo que: "Flat 12A High Rise" se convierte en "Flat 00012A High Rise", puede haber varios números en la cadena.

Hasta ahora tengo:

def pad_numbers_in_string(string, padding=5): 
    numbers = re.findall("\d+", string) 
    padded_string = '' 
    for number in numbers: 
     parts = string.partition(number) 
     string = parts[2] 
     padded_string += "%s%s" % (parts[0], parts[1].zfill(padding)) 
    padded_string += string 

return padded_string 

Puede eso ser mejorado - mira pugly a mí!

Respuesta

7

¿Qué tal esto?

re.sub('\d+', lambda x:x.group().zfill(padding), s) 

Ejemplo:

>>> s = "Flat 12A High Rise 101B" 
>>> padding = 5 
>>> re.sub('\d+', lambda x:x.group().zfill(padding), s) 
'Flat 00012A High Rise 00101B' 
>>> 
+0

Excelente mucho más limpio! – Ross

9

En lugar de cambiar sus datos para acomodar su algoritmo de clasificación, cambie su algoritmo de clasificación para acomodar sus datos.

Ver Sorting For Humans: Natural Sort Order en Coding Horror:

import re 

def sort_nicely(l): 
    """ Sort the given list in the way that humans expect. 
    """ 
    convert = lambda text: int(text) if text.isdigit() else text 
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
    l.sort(key=alphanum_key) 
+0

John - eso es excelente y exactamente lo que era inicialmente después, pero no sabía cómo! ¡Gracias! – Ross

Cuestiones relacionadas