2010-06-23 26 views
7

Mam wiele ciągów stylu adresu i chcę je sortować w sposób racjonalny.Jak wstawić wszystkie liczby w ciągu znaków

Czekam na umieszczenie wszystkich liczb w ciągu znaków, aby: "Płaski 12A wysoki wzrost" stał się "Płaski 00012A wysoki wzrost", może być wiele liczb w ciągu znaków.

Do tej pory mam:

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 

Może to zostać poprawione - wygląda pugly do mnie!

Odpowiedz

7

Jak chodzi?

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

Przykład:

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

Doskonały o wiele czystszy! – Ross

9

Zamiast zmieniać dane w celu dostosowania do algorytmu sortowania, zmień algorytm sortowania, aby uwzględnić dane.

Zobacz Sorting For Humans: Natural Sort Order na 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 - to jest to doskonałe i dokładnie to, co początkowo było po, ale nie wiem jak! Dziękuję Ci! – Ross

Powiązane problemy