写RE以使字符串介于第一个字母表和最后一个字母表之间



我需要打印两个缺失的字符串KMJD23KN0008393KMJD23KN0008394,但我收到的是KMJD23KN8393KMJD23KN8394。我也需要列表中缺失的零。

ll = ['KMJD23KN0008391','KMJD23KN0008392','KMJD23KN0008395','KMJD23KN0008396']
missList=[]
for i in ll:
reList=re.findall(r"[^Wd_]+|d+", i)
print(reList)

问题可以分解为三个部分:

  1. 提取尾部数字字符串
  2. 将该子字符串解释为实际数字,该数字应形成连续序列
  3. 根据周围的项目重新格式化丢失的项目

这些项目中隐含着多个假设。你需要意识到这些,最好把它们说清楚。在下文中,我使用了以下假设:

  • 任何在字符串末尾形成数字的东西都会被考虑。在此之前的所有内容都是前缀,并且假设在整个系列中都是相同的
  • 序列中的尾随数字始终具有相同的宽度
  • 列表中的项目按其尾部编号升序排列

以下代码实现了这些假设:

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字符串来实现的

最新更新