2010-06-23 102 views
7

我有很多地址樣式字符串,我想以合理的方式對它們進行排序。如何填充字符串中的所有數字

我在填充字符串中的所有數字,以便:「Flat 12A High Rise」變成「Flat 00012A High Rise」,字符串中可能有多個數字。

到目前爲止我有:

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 

可以在改善 - pugly看起來對我來說!

回答

7

這個怎麼樣?

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

例子:

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

非常乾淨! – Ross 2010-06-23 16:38:36

9

而不是改變你的數據以適應你的排序算法,改變你的排序算法,以適應你的數據。

Sorting For Humans: Natural Sort OrderCoding 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

約翰 - 這就是優秀,正是我最初是之後,但不知道怎麼樣!謝謝! – Ross 2010-06-23 16:39:26