Python格式化字符串使用列表范围

时间:2016-10-29 05:51:29

标签: python python-3.x format

我在stackOverflow和google上搜索了很多关于它的问题。但是没有一个解决了我的问题。

我们说我有一个不规则长度的字符串(如电话号码或特定和地区文件),例如:

docA="A123B456"
docB="A123B456CD"
docC="6CD"

我正在写一个打印文件的功能。但是他们没有明确的模式,我的方法是使用最常见的模式使用默认变量,并将角落案例的责任交给程序员。 e.g:

def printDoc(text, pattern="{}{}{}{}#{}{}{}-{}")
    print(pattern.format(*text))

但如果有一种简化模式的方法,那将会更加清晰明确

def printDoc(text, pattern="{0:3}#{4:-1}-{-1}")
    print(pattern.format(*text))

然后我就可以使用它了:

printDoc(docA)
printDoc(docB)
printDoc(docC, "{0:1}-{2}")

但它不是一个有效的语法。有一种方法可以做到这一点吗?

如果我的方法有误,我将很高兴知道更好的方法。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式从格式字符串中解析索引/切片,并使用它们来索引给定的文本。在使用str.format之前,您还必须从格式字符串中删除indeces。唯一棘手的部分实际上是从text获取格式参数,但如果您认为eval可以接受,则可以执行以下操作:

import re

def printDoc(text, pattern="{0:3}#{4:-1}-{-1}"):
    params = []

    # Find occurrences of '{}' from format string and extract format parameter
    for m in re.finditer(r'\{([-:\d]+)\}', pattern):
        params.append(eval('text[{}]'.format(m.group(1))))

    # Remove indeces from format string
    pattern = re.sub(r'\{([-:\d]+)\}', '{}', pattern)
    print(pattern.format(*params))

printDoc('A123B456')

输出:

A12#B45-6

请注意,使用eval通常被视为bad and unsafe practice。虽然由于eval给出的字符集限制,潜在风险有限,但您可能需要考虑其他替代方案,除非您是控制格式字符串的人。