我需要打印两个缺失的字符串KMJD23KN0008393
和KMJD23KN0008394
,但我收到的是KMJD23KN8393
和KMJD23KN8394
。我也需要列表中缺失的零。
ll = ['KMJD23KN0008391','KMJD23KN0008392','KMJD23KN0008395','KMJD23KN0008396']
missList=[]
for i in ll:
reList=re.findall(r"[^Wd_]+|d+", i)
print(reList)
问题可以分解为三个部分:
- 提取尾部数字字符串
- 将该子字符串解释为实际数字,该数字应形成连续序列
- 根据周围的项目重新格式化丢失的项目
这些项目中隐含着多个假设。你需要意识到这些,最好把它们说清楚。在下文中,我使用了以下假设:
- 任何在字符串末尾形成数字的东西都会被考虑。在此之前的所有内容都是前缀,并且假设在整个系列中都是相同的
- 序列中的尾随数字始终具有相同的宽度
- 列表中的项目按其尾部编号升序排列
以下代码实现了这些假设:
all_missing = []
last_num = int(re.search(r'd+$', ll[-1])[0])
prefix = re.match('.*D', ll[0])[0]
for item in ll:
num_str = re.search(r'd+$', item)[0]
num = int(num_str)
num_width = len(num_str)
for missing in range(last_num + 1, num):
all_missing.append(f'{prefix}{missing:0{num_width}}')
last_num = num
print(all_missing)
这里的一些注意事项:
- 要提取尾部数字,一个非常简单的正则表达式就足够了:
d+$
。即:一个或多个数字,直到字符串结束 - 相反,为了提取前缀,我们搜索最后一个字符是非数字的任意字符序列。即:
.*D
- 为了重新格式化丢失的项目,我们将前缀与丢失的数字连接起来,并用零(从左起(填充丢失的数字,直到它达到预期的宽度。这是通过使用带有格式说明符
'0{num_width}'
的Python的f字符串来实现的