首页 > 解决方案 > 将给定数字转换为所需格式的正则表达式

问题描述

我是第一次使用正则表达式,因此需要一个稍微复杂的正则表达式的帮助。我有大约 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位数字,所以应该保持不变(这就是为什么我不能使用python的字符串格式(.format)选项)这里必须使用正则表达式,它只会修改需要数字。我已经尝试了以下答案,但无法解决。

标签: pythonregexpython-2.7

解决方案


您的正则表达式不像您\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+ 个数字开头的字符串,然后是 has -,然后是 1+ 个数字,然后是 1+ 个数字,-然后是字符串的结尾。有三个捕获组,其值可以用引用\1\2\3从替换模式中反向引用。但是,由于我们需要.zfill(5)对每个捕获的文本进行应用,因此使用 lambda 表达式作为替换参数,并通过 match 数据对象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']

推荐阅读