在str.format中切片字符串

use*_*887 18 python string string-formatting

我希望通过以下方式实现以下目标str.format:

x,y = 1234,5678
print str(x)[2:] + str(y)[:2]
Run Code Online (Sandbox Code Playgroud)

我能做到的唯一方法是:

print '{0}{1}'.format(str(x)[2:],str(y)[:2])
Run Code Online (Sandbox Code Playgroud)

现在,这个例子和我真正拥有的是一个冗长而凌乱的字符串,所以我想把切片放在里面{}.我研究了文档,但我无法弄清楚正确的语法.我的问题是:是否可以在替换字段内切换字符串?

Mar*_*ers 15

不,您不能将切片应用于替换字段内的字符串.

你需要参考格式规范迷你语言 ; 它定义了什么可能的.这种迷你语言定义了如何格式化引用值(:替换字段语法之后的部分).

  • 是的,这是我的观点 - OP并不是完全疯狂的期待切片,只是不幸的是它还没有实现.=) (4认同)
  • 请注意,你_can_获取单个字符(`"{foo [0]}".format(foo ="bar")`)但这不是真正的Python切片. (2认同)

sbe*_*rry 6

你可以这样做.

注意
这是一个粗略的例子,不应被视为完整和测试.但我认为它会向您展示一种开始到达目的地的方法.

import string

class SliceFormatter(string.Formatter):

    def get_value(self, key, args, kwds):
        if '|' in key:
            try:
                key, indexes = key.split('|')
                indexes = map(int, indexes.split(','))
                if key.isdigit():
                    return args[int(key)][slice(*indexes)]
                return kwds[key][slice(*indexes)]
            except KeyError:
                return kwds.get(key, 'Missing')
        return super(SliceFormatter, self).get_value(key, args, kwds)


phrase = "Hello {name|0,5}, nice to meet you.  I am {name|6,9}.  That is {0|0,4}."
fmt = SliceFormatter()
print fmt.format(phrase, "JeffJeffJeff", name="Larry Bob")
Run Code Online (Sandbox Code Playgroud)

OUTPUT

Hello Larry, nice to meet you.  I am Bob.  That is Jeff.
Run Code Online (Sandbox Code Playgroud)

注2:
没有为切片一样,没有支持[:5][6:],但我认为这将是很容易的实现也是如此.切片索引也没有错误检查超出范围等.