如何为字符串中的所有数字填充空白
我有很多地址风格的字符串,想要以合理的方式对它们进行排序。
我想把字符串中的所有数字进行补零处理,比如把“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
这个能改进吗?我觉得看起来不太好!
2 个回答
10
与其为了排序算法去改变你的数据,不如调整你的排序算法来适应你的数据。
可以参考 为人类排序:自然排序顺序 这篇文章,来自 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 )
8
这样怎么样?
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'
>>>