Pythonで文字列をタイトルケースに変換する方法は?


94

例:

HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco

このタスクを実行するためのライブラリまたは標準的な方法はありますか?


16
それは「キャメルケース」ではなく、「キャピタライズ」です。どちらがいいですか?
Andrew Marshall

13
camelCase isLike this。
ジョナサンM

5
例ではPascalCaseを使用しています。
David Betz 2016

回答:


213

titleドキュメントからRightを使用しないのはなぜですか。

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

PascalCaseが本当に必要な場合は、これを使用できます。

>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'

5
「They're」の「r」は小文字にすべきだと思います。また、「Bill's」の「s」は間違いなく小文字でなければなりません。
Daniel Fischer、

3
@Daniel-その問題は、ドキュメントでtitle次のように記されています。これは望ましい結果ではない可能性があります。」1つの可能な解決策は、正規表現でローレンスの回答を使用して、r"['\w]+"アポストロフィが一致を終了しないようにすることです(必要に応じて、追加の句読点を追加できます)。
Andrew Clark

18
記録のために、最後のキャメルケースの例を行うためのよりきちんとした方法は次のとおり'make IT camel CaSe'.title().replace(' ', '')です。
Henry Gomersall 2013年

15
他の誰かが狂った薬を飲んでいるように感じたら、これはキャメルケースではなくパスカルケースです。
Rob

4
素晴らしいコードですが、キャメルケースは大文字で始まりません。これを試してください: def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:] 使用方法:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Ron Kalian

21

これは常に小文字で始まり、英数字以外の文字も取り除きます:

def camelCase(st):
    output = ''.join(x for x in st.title() if x.isalnum())
    return output[0].lower() + output[1:]

8
def capitalizeWords(s):
  return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)

re.sub「置換」用の関数をとることができます(ほとんどの人がよく知っているように見える文字列だけではありません)。このrepl関数はre.Match、パターンの一致ごとにオブジェクトを使用して呼び出され、結果(文字列である必要があります)がその一致の代わりとして使用されます。

同じもののより長いバージョン:

WORD_RE = re.compile(r'\w+')

def capitalizeMatch(m):
  return m.group(0).capitalize()

def capitalizeWords(s):
  return WORD_RE.sub(capitalizeMatch, s)

これはパターン(通常は適切な形式と見なされます)をプリコンパイルし、ラムダの代わりに名前付き関数を使用します。


これはかなりきちんとしています、私はラムダ関数に頭を悩ませています、助けてくれてありがとう
Daydreamer

1
@JohnMachin私はちょうどいくつかの説明を追加するとあなたの答えがより完全でより良いものになると思ったので私はちょうど尋ねました。
NN

@Laurence Gonsalvesラムダはここで何をしていますか?
ザイオン

ここでラムダは何をしていますか?私は解読できるところから、そしてあなたからの説明。これは私が理解したことです。re.subで関数を使用すると、それぞれmatchが関数に渡されますか?そして以来、matches正規表現では、グループを持っています。それがこの行が存在する理由lambda m:m.group(0).capitalize()ですか?
ザイオン

@Zionはい。ときre.sub(例:機能)を呼び出し可能与えられている「代替」として、その呼び出し可能に一致するオブジェクトを渡し、それが実際に代替として使用するものである文字列を取り戻すことを期待。ラムダが紛らわしい場合、「長いバージョン」はより詳細な方法でまったく同じことを行います。
ローレンスゴンサルベス

5

書いてみませんか?このようなものがあなたの要件を満たすかもしれません:

def FixCase(st):
    return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())

おかげで、それは完全に助けました。私の悪いところ、私はそもそも1つ書くつもりはありませんでした
Daydreamer

5

注:なぜさらに別の回答を提供するのですか? この回答は、質問のタイトルと、キャメルケースが次のように定義されているという概念に基づいています。連結された一連の単語(スペースなし!)で、元の単語のそれぞれが大文字で始まる(残りは小文字)シリーズの最初の単語(完全に小文字)を除いて。また、「すべての文字列」はASCII文字セットを指すと想定されています。Unicodeはこのソリューションでは機能しません)。

簡単な

上記の定義を考えると、この関数は

import re
word_regex_pattern = re.compile("[^A-Za-z]+")

def camel(chars):
  words = word_regex_pattern.split(chars)
  return "".join(w.lower() if i is 0 else w.title() for i, w in enumerate(words))

が呼び出されると、このようになります

camel("San Francisco")  # sanFrancisco
camel("SAN-FRANCISCO")  # sanFrancisco
camel("san_francisco")  # sanFrancisco

それほど単純ではない

すでにキャメルのケースに入った文字列を提示すると失敗することに注意してください!

camel("sanFrancisco")   # sanfrancisco  <-- noted limitation

さらにシンプルではない

多くのユニコード文字列で失敗することに注意してください

camel("México City")    # mXicoCity     <-- can't handle unicode

私はこれらのケース(またはいくつかの創造性で導入される可能性のある他のケース)に対する解決策を持っていません。したがって、文字列に関連するすべてのことと同様に、独自のエッジケースをカバーし、Unicodeで頑張ってください!


文の意味を知らなくても、文字列がキャメルケースであることをどのように判断できますか?「それほど単純ではない」例では、「sanfRancisco」はキャメルケースであり、「itSnotcaMelcAse」です。
Patrice Bernassola 2017

入力にアポストラフィまたはその他の句読点があったと思いますか?他の失敗した入力に注意する必要があります。間違いなく良いキャッチです。あなたが提供した入力は何でしたか?
Marc、

1
つまり、スペースのない一連の文字は1ワードと見なす必要があります。文章の意味を知らないと、そこから仕事を抽出することはできません。camello()の入力として「sanfRancisco」または「itSnotcaMelcAse」を入力すると、出力が同じになることがわかります。
Patrice Bernassola 2017

ああ、そうです。そうです、あなたは正しいと思います。私はソリューションをオーバーフィットしました。更新します。
マルク

4

潜在的なライブラリ:https : //pypi.org/project/stringcase/

例:

import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"

スペースを残すかどうかは疑問ですが(例ではスペースを削除することを示していますが、バグトラッカーの問題があり、スペースを残すことに注意しています)。


はい、はい。パッケージを探していました。このパッケージには、snakecaseおよびその他の変換関数も含まれています。
s2t2

1

.title()を使用するだけで、大文字のすべての単語の最初の文字が変換され、残りは小さくなります。

>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True

1

この投稿に私の小さな貢献を追加したいと思います。

def to_camelcase(str):
  return ' '.join([t.title() for t in str.split()])

実際、str.title()は同じであり、計算コストを節約しています。
Auros132

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.