2010-06-23 41 views
7

Tôi đã có rất nhiều chuỗi kiểu địa chỉ và tôi muốn sắp xếp chúng theo cách hợp lý.Làm thế nào để pad tất cả các số trong một chuỗi

Tôi đang tìm cách xóa tất cả các số trong chuỗi sao cho: "Mức tăng cao 12A phẳng" trở thành "Tăng cao 00012A phẳng", có thể có nhiều số trong chuỗi.

Cho đến nay tôi đã có:

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 

mà có thể được cải thiện - trông pugly với tôi!

Trả lời

7

Làm thế nào về điều này?

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

Ví dụ:

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

Tuyệt vời hơn nhiều! – Ross

9

Thay vì thay đổi dữ liệu để phù hợp với thuật toán sắp xếp của bạn, hãy thay đổi thuật toán sắp xếp để phù hợp với dữ liệu của bạn.

Xem Sorting For Humans: Natural Sort Order trên 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 - thats tuyệt vời và chính xác những gì tôi ban đầu là sau nhưng không biết làm thế nào để! Cảm ơn bạn! – Ross

Các vấn đề liên quan