python - 将给定数字转换为所需格式的正则表达式
问题描述
我是第一次使用正则表达式,因此需要一个稍微复杂的正则表达式的帮助。我有大约 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)选项)这里必须使用正则表达式,它只会修改需要数字。我已经尝试了以下答案,但无法解决。
解决方案
您的正则表达式不像您\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']
推荐阅读
- c++ - 从 for 循环中给出最小的数字并使 switch 无限
- nginx - 如何在 nginx 上强制明确的“http://example.com”到 https
- encryption - 在经典 ASP (Rijndael) 中使用 AES 加密/解密
- ansible - 并行运行某些 ansible 任务
- design-patterns - redux sagas 背后的模式
- python - 多类 plotnine geom_density 图不起作用
- unix - Unix awk 命令执行特定逻辑
- sql - 具有关系和列比较的 SQL 查询
- c# - 接口继承VS类实现两个接口
- node.js - DyanmoDB获取功能alexa技能范围问题