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

Я впервые использую регулярное выражение, поэтому мне нужна помощь с одним немного сложным регулярным выражением. У меня есть список ввода около 100-150 строковых объектов (чисел).

input = ['90-10-07457', '000480087800784', '001-713-0926', '12-710-8197', '1-345-1715', '9-23-4532', '000200007100272']

Expected output = ['00090-00010-07457', '000480087800784', '00001-00713-00926', '00012-00710-08197', '00001-00345-01715', '00009-00023-04532', '000200007100272']

## I have tried this -

import re
new_list = []
for i in range (0, len(input)):
    new_list.append(re.sub('\d+-\d+-\d+','0000\\1', input[i]))

## problem is with second argument '0000\\1'. I know its wrong but unable to solve
print(new_list)  ## new_list is the expected output.

Как видите, мне нужно преобразовать строку чисел разных форматов в 15-значные числа, добавив к ним начальные нули.

Но здесь есть загвоздка, то есть некоторые числа, т.е. '000480087800784 ', уже составляют 15 цифр, поэтому их следует оставить без изменений (поэтому я не могу использовать опцию форматирования строки (.format) в python). Здесь необходимо использовать Regex, что будет изменить только необходимые номера. Я уже попробовал следующие ответы, но не смог решить.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Ваше регулярное выражение не работает, поскольку вы использовали \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']
0 голосов
/ 17 января 2019

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

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...