2013-07-25 32 views
7

文字列フォーマットを使用して単語を大文字にすることはできますか?たとえば、Python:string.format()を使用して単語を大文字にする

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

は、「Foobar did such such and such」を返します。

私はよく.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) 

をあなたが見ることができるように、それはまた誤っ(適用されるので、ちょうど.format()x.capitalize()ようuserを定義することは、動作しません。しかし、ここで私が使用しているコード(の非常に単純化されたバージョン)です)を最初のシナリオに設定します。私は運命を予測することができないので、どのrandom.choiceが事前に選択されるのか分からない。私に何ができる?

Addt'lノート:ちょうどoutput = random.choice(['xyz'.format(),'lmn'.format()])printmeいるため、実行可能な選択肢ではない(つまり、個々の文字列をフォーマットし、それを必要とするもののため.capitalize()を使用して)実際にから選択されること〜40 +文字列。

+0

をオーバーロードする必要がありますか? –

+0

@ IgnacioVazquez-Abramsユーザー名は、実際にはユーザー名**または**の代名詞に等しいです。代名詞の場合、大文字と小文字は常に大文字になりません。 – tehsockz

+0

お待ちください...ユーザー名の大文字/小文字は変更できません。どうしてそうするか?人々は、ユーザー名がボックスに入力した場合とまったく同じであると予想しています。 – user2357112

答えて

5

独自のサブクラスstring.Formatterを作成することで、文字列を再作成するために使用できるカスタムconversionを認識することができます。

myformatter.format('{user!u} did la-dee-dah on {date}, and {pronoun!l} liked it. ', 
         user=x, date=y, pronoun=z) 
+2

他に誰かがこの質問をしている場合に参考にしてください、[ここでは変更が必要な機能です](http://hg.python.org/cpython/file/2.7/Lib/string.py#l602)。 – tehsockz

+1

s/changed/overridden/ –

4

あなたは余分な値を渡すことができ、ちょうど

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()) 

この軽量オプションのように、それらを使用しない最良の選択は、おそらくあなたがあなた自身のfullblown Formatterを必要とするために十分これをやっているかどうかによって異なります。

+2

私はこのアプローチが好きです!ええ、私はもっと大規模に(600以上のメッセージや、さまざまな機能(大文字ではなく))しているので、私の状況には当てはまりませんが、心に留めておいてください。 – tehsockz

0

@ IgnacioVazquez-Abramsと同様に、string.Formatterのサブクラスを作成して、書式文字列処理を拡張/変更できるようにします。あなたのケースでは

、あなたは、任意のユーザー名をrecasingているのはなぜ方法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 
     super(ExtendedFormatter, self).convert_field(value, conversion) 

     # return for None case 
     return value 


# Test this code 

myformatter = ExtendedFormatter() 

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


output = myformatter.format(template_str, test="DiDaDoDu") 
print(output) 
関連する問題