Ваше регулярное выражение не работает, поскольку вы использовали \1
при замене, но шаблон регулярного выражения не имеет соответствующей группы захвата. \1
относится к первой группе захвата в шаблоне.
Если вы хотите попробовать свои силы в регулярных выражениях, вы можете использовать
re.sub(r'^(\d+)-(\d+)-(\d+)$', lambda x: "{}-{}-{}".format(x.group(1).zfill(5), x.group(2).zfill(5), x.group(3).zfill(5)), input[i])
См. Демоверсию Python .
Здесь ^(\d+)-(\d+)-(\d+)$
соответствует строке, которая начинается с 1+ цифр, затем имеет -
, затем 1+ цифр, -
и снова 1+ цифр, за которыми следует конец строки. Существует три группы захвата, значения которых можно ссылаться с помощью обратных ссылок \1
, \2
и \3
из шаблона замены. Однако, поскольку нам нужно применить .zfill(5)
к каждому захваченному тексту, лямбда-выражение используется в качестве аргумента замены, а к захватам осуществляется доступ с помощью объекта данных соответствия group()
метод.
Однако, если ваши строки уже в правильном формате, вы можете просто разделить строки и отформатировать их при необходимости:
for i in range (0, len(input)):
splits = input[i].split('-')
if len(splits) == 1:
new_list.append(input[i])
else:
new_list.append("{}-{}-{}".format(splits[0].zfill(5), splits[1].zfill(5), splits[2].zfill(5)))
См. еще одну демонстрацию Python . Оба решения дают
['00090-00010-07457', '000480087800784', '00001-00713-00926', '00012-00710-08197', '00001-00345-01715', '00009-00023-04532', '000200007100272']