2010-06-23 25 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