2011-08-14 4 views

答えて

9
def titlecase(value): 
    return "".join(word.title() for word in value.split("_")) 

をPythonは正規表現よりも読みやすい、そしてあなたが望むものをやっていないときに簡単修正します。

あなたが同様に小文字の最初の文字をしたい場合は、私は、ちょうど最初の文字小文字に、ほとんどの作業を行うために上記の関数を呼び出す第二の機能を使用します:jtbandesが言ったように

def titlecase2(value): 
    return value[:1].lower() + titlecase(value)[1:] 
+1

正確に。正規表現は赤ちゃんだった。文字列オブジェクトのメソッドがあなたが望むことをするかどうかをチェックする前に、正規表現を使用しないでください。この場合、 'split'は文字列をトークン化し、' title'は便利に単語を大文字にします。 –

2

正規表現にエラーがあります。代わりに、しかし

([a-z][A-Z][0-9]+) # would match 'oN3' but not 'one' 

使用

([a-zA-Z0-9]+) # matches any alphanumeric word 

r'\2'.upper()がそのように使用することはできませんので、これも動作しません。代わりに、試してみてください。

s1 = re.sub('(_)([a-zA-Z0-9]+)', lambda p: p.group(2).capitalize(), value) 
0

を、文字クラスを一緒にマッシュする必要があります

([a-zA-Z0-9]+) 

次のトリックは、あなたが置き換えを行うことです。あなたは

r'\2'.upper() 

(上段)を言うとき、実際に前と呼ばれるサブ起こります。しかし、あなたはsubの別の機能を使用することができます:あなたは試合を処理するために関数を渡すことができます。

re.sub('(_)([a-zA-Z0-9]+)', lambda match: match.group(2).capitalize(), value) 

今、あなたのラムダが一致して呼び出されます。また、あなたは交換が複数の場所で発生持ってsubnを使用することができます。

re.subn('(_)([a-zA-Z0-9]+)', lambda match: match.group(2).capitalize(), value)[0] 
2

@kindallは、(クレジットは彼に行く)良い解決策を提供します。 しかし、あなたは構文たい場合は、「myCamel」最初の単語を大文字にする必要はありませんが、あなたは少し変更する必要があります:正規表現を使用して、NotCamelCaseについては

def titlecase(value): 
    rest = value.split("_") 
    return rest[0]+"".join(word.title() for word in rest[1:]) 
2

をまたはループはやり過ぎのように聞こえます。

str.title().replace("_", "") 
+0

+1これは素晴らしい答えです。パーティーに遅れているという呪い。 – Nate

関連する問題