首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python如何强制一个字符串与另一个字符串的格式匹配

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

Stack Overflow用户
提问于 2013-08-06 18:44:23
回答 3查看 355关注 0票数 4

我有一些Python脚本,我已经为我在那里工作的评税员办公室编写了一些脚本。其中大多数都要求输入包裹ID号(然后用来通过odbc获取某些数据)。对于如何输入包裹ID,他们并不十分一致。

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

1:“1005191000060”

2:'001005191000060‘

3:“0010-05-19-100-006-0”

第三种方式是正确的方式,所以我需要确保输入是固定的,以始终匹配该格式。当然,他们更愿意输入前两种方式之一的ID。包裹号必须是15位长(20带破折号)。

我目前有一个工作方法,我如何修复包裹ID,但它是非常丑陋的。我想知道是否有人知道更好的方法(或更“毕多尼”的方式)。我有一个函数通常被导入到所有这些脚本中。以下是我所拥有的:

代码语言:javascript
复制
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“变量。有什么想法吗?我在正则表达式模块中找不到任何可以这样做的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-06 18:54:29

您可以使用itertools.islice代替手动切片

代码语言:javascript
复制
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')

输出:

代码语言:javascript
复制
0010-05-19-100-006-0
0010-05-19-100-006-0
0010-05-19-100-006-0
票数 3
EN

Stack Overflow用户

发布于 2013-08-06 18:55:10

我就不用雷克斯了。你只想得到所有的数字,忽略连字符,左垫与0,然后插入连字符在正确的位置,对吗?所以:

代码语言:javascript
复制
def format_pid(pid):
    p = pid.replace('-', '')
    if not p.isdigit():
        raise ValueError('Invalid format: {}'.format(pid))
    p = p.zfill(15)
    # You can use your `join` call instead of the following if you prefer.
    # Or Ashwini's islice call.
    return '{}-{}-{}-{}-{}-{}'.format(p[:4], p[4:6], p[6:8], p[8:11], p[11:14], p[14:])
票数 4
EN

Stack Overflow用户

发布于 2022-10-17 09:44:45

所有这些答案都做得有点过头了,伊豪。

rstr是一个辅助模块,可以轻松地生成各种类型的随机字符串。它可以用于模糊测试、生成虚拟数据或其他应用程序。

代码语言:javascript
复制
ASSESSOR_PARCEL = rstr.xeger('^\\d{14}$')
print(ASSESSOR_PARCEL)

>>> 57203112454660
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18088094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档