Python如何强制一个字符串匹配另一个字符串的格式

我有一些我为Assessor办公室编写的
Python脚本.其中大多数要求输入包裹ID号(然后用于通过odbc获取某些数据).他们对如何输入包裹ID并不十分一致.

所以这是我的问题,他们以3种方式之一输入包裹ID:

1:’1005191000060′

2:’001005191000060′

3:’0010-05-19-100-006-0′

第三种方式是正确的方法,所以我需要确保输入被修复为始终匹配该格式.当然,他们宁愿输入ID中的前两种方式之一.包裹号码必须始终为15位数(20个带短划线)

我目前有一个关于如何修复包裹ID的工作方法,但它非常难看.我想知道是否有人知道更好的方式(或更多的“Pythonic”方式).我有一个通常导入到所有这些脚本的函数.这是我有的:

import re

def FormatPID(in_pid):
    pid_format = re.compile('\d{4}-\d{2}-\d{2}-\d{3}-\d{3}-\d{1}')
    pid = in_pid.zfill(15) 
    if not pid_format.match(pid):
        fixed_pid = '-'.join([pid[:4],pid[4:6],pid[6:8],pid[8:11],pid[11:-1],pid[-1]])
        return fixed_pid
    else:
        return pid

if __name__ == '__main__':

    pid = '1005191000060'
##    pid = '001005191000060'
##    pid = '0010-05-19-100-006-0'

    # test
    t = FormatPID(pid)
    print t

这确实工作得很好,但我已经被这个丑陋的代码困扰了一段时间,我认为必须有一个比切片更好的方法.我希望有一种方法可以“强制”将其转换为字符串以匹配“pid_format”变量.有任何想法吗?我在正则表达式模块中找不到任何要做的事情

最佳答案 您可以使用itertools.islice而不是手动切片:

import re
from itertools import islice
groups = (4, 2, 2, 3, 3, 1)
def FormatPID(in_pid):
    pid_format = re.compile('\d{4}-\d{2}-\d{2}-\d{3}-\d{3}-\d{1}')
    in_pid = in_pid.zfill(15)
    if not pid_format.match(in_pid):
        it = iter(in_pid)
        return '-'.join(''.join(islice(it, i)) for i in groups)
    return in_pid

print FormatPID('1005191000060')
print FormatPID('001005191000060')
print FormatPID('0010-05-19-100-006-0')

输出:

0010-05-19-100-006-0
0010-05-19-100-006-0
0010-05-19-100-006-0
点赞