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

标签 python regex string python-2.7 formatting

我有一些 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”变量。有任何想法吗?我在正则表达式模块中找不到任何东西可以做到这一点

最佳答案

我不会费心使用正则表达式。您只想获取所有数字,忽略连字符,用 0 向左填充,然后在正确的位置插入连字符,对吗?所以:

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:])

关于Python如何强制一个字符串匹配另一个字符串的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18088094/

相关文章:

javascript - Django - 使用脚本实时获取 HTML 中两个元素之间的 "total"

c - 为什么在 c 中动态分配时会出现段错误?

javascript - 替换字符串值

python - 我有两个字典,想将它们的一部分合并在一起

python - 如何在 python 中生成音符或和弦?

python - Pandas :Dataframe.Drop - ValueError:标签 ['id'] 不包含在轴中

javascript - 删除过多的空白行

c++ - 使用 Boost 就地替换正则表达式

java - 使用正则表达式将字符串大写

regex - Perl 和 Regex - 单行模式匹配