Регулярное выражение для преобразования заданного числа в требуемый формат

Временное решение. Откройте окно модального всплывающего окна и вставьте внешний URL в качестве iframe.

1
задан Wiktor Stribiżew 17 January 2019 в 11:52
поделиться

2 ответа

Как насчет анализа строки на предмет чисел и тире, а затем добавления лидирующих нулей?

input = ['90-10-07457', '000480087800784', '001-713-0926', '12-710-8197', '1-345-1715', '9-23-4532', '000200007100272']
output = []
for inp in input:
    # calculate length of string
    inpLen = len(inp)
    # calculate num of dashes
    inpDashes = inp.count('-')
    # add specific number of leading zeros
    zeros = "0" * (15-(inpLen-inpDashes))
    output.append(zeros + inp)
print (output)

>>> ['00000090-10-07457', '000480087800784', '00000001-713-0926', '00000012-710-8197', '00000001-345-1715', '000000009-23-4532', '000200007100272']
0
ответ дан Asmox 17 January 2019 в 11:52
поделиться

Ваше регулярное выражение не работает, как вы использовали \1 при замене, но шаблон регулярного выражения не имеет соответствующей группы захвата. \1 относится к первой группе захвата в шаблоне.

Если вы хотите попробовать свои силы в регулярных выражениях, вы можете использовать

re.sub(r'^(\d+)-(\d+)-(\d+) 

См. Демо 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']
, 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']
0
ответ дан Wiktor Stribiżew 17 January 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: