2010-06-23 13 views
7

Ho un sacco di stringhe di stile indirizzo e voglio ordinarle in modo razionale.Come riempire tutti i numeri in una stringa

Sto cercando di riempire tutti i numeri in una stringa in modo che: "Flat 12A High Rise" diventa "Flat 00012A High Rise", potrebbero esserci più numeri nella stringa.

Finora ho ottenuto:

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 

può che essere migliorato - guarda pugly a me!

risposta

7

ne dici di questo?

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

Esempio:

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

Eccellente molto più pulito! – Ross

9

Invece di modificare i dati per adattarli all'algoritmo di ordinamento, modificare l'algoritmo di ordinamento in base ai dati.

Vedi Sorting For Humans: Natural Sort Order su 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 - questo è eccellente e esattamente quello che inizialmente è stato dopo, ma non sapeva come! Grazie! – Ross

Problemi correlati