23

是否可以使用字符串格式将单词大写?例如,

"{user} did such and such.".format(user="foobar")

应该返回“Foobar 做了这样那样的事情”。

请注意,我很清楚.capitalize();但是,这是我正在使用的(非常简化的版本)代码:

printme = random.choice(["On {date}, {user} did la-dee-dah. ",
                         "{user} did la-dee-dah on {date}. "
                         ])

output = printme.format(user=x,date=y)

如您所见,仅定义userasx.capitalize().format()行不通的,因为那时它也将(错误地)应用于第一个场景。而且由于我无法预测命运,所以无法知道random.choice会提前选择哪个。我能做些什么?

补充说明:只是做output = random.choice(['xyz'.format(),'lmn'.format()])(换句话说,单独格式化每个字符串,然后将.capitalize()其用于需要它的字符串)不是一个可行的选择,因为printme实际上是从大约 40 多个字符串中进行选择。

4

4 回答 4

16

正如@IgnacioVazquez-Abrams 所说,创建一个string.Formatter允许您扩展/更改格式字符串处理的子类。

在您的情况下,您必须重载该方法convert_field

from string import Formatter
class ExtendedFormatter(Formatter):
    """An extended format string formatter

    Formatter with extended conversion symbol
    """
    def convert_field(self, value, conversion):
        """ Extend conversion symbol
        Following additional symbol has been added
        * l: convert to string and low case
        * u: convert to string and up case

        default are:
        * s: convert with str()
        * r: convert with repr()
        * a: convert with ascii()
        """

        if conversion == "u":
            return str(value).upper()
        elif conversion == "l":
            return str(value).lower()
        # Do the default conversion or raise error if no matching conversion found
        return super(ExtendedFormatter, self).convert_field(value, conversion)

# Test this code

myformatter = ExtendedFormatter()

template_str = "normal:{test}, upcase:{test!u}, lowcase:{test!l}"


output = myformatter.format(template_str, test="DiDaDoDu")
print(output)
于 2017-09-11T16:41:49.807 回答
11

您可以传递额外的值而不使用它们,就像这个轻量级选项

printme = random.choice(["On {date}, {user} did la-dee-dah. ",
                         "{User} did la-dee-dah on {date}. "
                         ])

output = printme.format(user=x, date=y, User=x.capitalize())

最好的选择可能取决于您是否做得足够需要您自己的成熟的Formatter.

于 2013-07-25T03:20:58.123 回答
10

您可以创建自己的子类,string.Formatter该子类将允许您识别可用于重新封装字符串的自定义转换。

myformatter.format('{user!u} did la-dee-dah on {date}, and {pronoun!l} liked it. ',
                      user=x, date=y, pronoun=z)
于 2013-07-25T03:02:16.790 回答
4

在 python 3.6+ 中,您现在可以使用 fstrings。https://realpython.com/python-f-strings/

>>> txt = 'aBcD'
>>> f'{txt.upper()}'
'ABCD'
于 2020-07-18T21:10:04.553 回答