파이썬에서 문자열을 제목 대소 문자로 변환하는 방법은 무엇입니까?


96

예:

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

이 작업을 수행하는 라이브러리 또는 표준 방법이 있습니까?


16
그것은 "CamelCase"가 아니라 "Capitalize"입니다. 당신은 무엇을 원하십니까?
Andrew Marshall 2011

13
camelCase는 이렇습니다.
Jonathan M

5
귀하의 예제는 PascalCase를 사용합니다.
David Betz

답변:


218

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. "알고리즘은 단어의 단순한 언어 독립적 정의를 연속 된 문자 그룹으로 사용합니다. 정의는 많은 상황에서 작동하지만 축약 형 및 소유격의 아포스트로피가 단어 경계를 형성 함을 의미합니다. 원하는 결과가 아닐 수 있습니다. " 한 가지 가능한 해결책은 정규식과 함께 Laurence의 대답을 사용 r"['\w]+"하여 아포스트로피가 일치를 끝내지 않도록하는 것입니다 (필요에 따라 추가 구두점을 추가 할 수 있음).
Andrew Clark 2011

18
기록을 위해 마지막 CamelCase 예제를 수행하는 깔끔한 방법은 'make IT camel CaSe'.title().replace(' ', '').
Henry Gomersall 2010 년

15
다른 사람이 미친 약을 먹고 있다고 느끼면 이것은 camelCase가 아니라 PascalCase입니다.
Rob

4
멋진 코드이지만 camelCase는 CAPITAL로 시작하지 않습니다. 이것을 시도하십시오 : 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 람다가 여기서 뭐하는거야?
Zion

여기서 람다는 무엇을하고 있습니까? 내가 해독 할 수있는 방법과 설명에서. 이것이 내가 이해 한 것입니다. re.sub에서 함수를 사용할 때 각각 함수에 match전달됩니까? matches정규식에는 그룹이 있기 때문 입니다. 그래서이 라인이 존재 lambda m:m.group(0).capitalize()합니까?
Zion

@Zion 예. 때 re.sub호출 가능한 주어진다은 "교체"로 (예 : 기능), 그 호출에 일치하는 객체를 전달하고 예상하는 실제로 교체로 사용하는 것입니다 문자열을 다시 얻을. 람다가 헷갈 린다면 "긴 버전"이 더 자세한 방법으로 똑같은 일을합니다.
로렌스 곤살 베스

5

왜 하나 쓰지 않습니까? 다음과 같은 것이 귀하의 요구 사항을 충족시킬 수 있습니다.

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

감사합니다. 완전히 도움이되었습니다. 내 나쁜, 나는 처음에 하나를 쓸 생각이 없었습니다
daydreamer

5

참고 : 다른 답변을 제공하는 이유는 무엇입니까? 이 답변은 질문의 제목과 camelcase가 다음과 같이 정의된다는 개념을 기반으로합니다. 각 원래 단어가 대문자로 시작되도록 (나머지는 소문자) 연결된 일련의 단어 (공백 없음!) 시리즈의 첫 번째 단어 (완전히 소문자)를 제외하고. 또한 "모든 문자열"이 ASCII 문자 집합을 참조한다고 가정합니다. 유니 코드는이 솔루션에서 작동하지 않습니다).

단순한

위의 정의가 주어지면이 함수는

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

나는 이러한 경우 (또는 약간의 창의력으로 도입 될 수있는 다른 경우)에 대한 해결책이 없습니다. 따라서 문자열과 관련된 모든 일과 마찬가지로 고유 한 케이스를 커버하고 유니 코드로 행운을 빕니다!


문장의 의미를 모르고 문자열이 카멜 케이스인지 어떻게 알 수 있습니까? "간단하지 않은"예에서 "sanfRancisco"는 "itSnotcaMelcAse"와 함께 Camel 케이스입니다.
Patrice Bernassola 17.07.25

나는 당신의 입력에 사도 또는 다른 구두점이 있다고 생각합니까? 다른 실패한 입력에 주목해야합니다. 확실히 좋은 캐치. 제공 한 정보는 무엇입니까?
Marc

1
공백이없는 일련의 문자는 1 단어로 간주해야한다는 의미입니다. 문장의 의미를 모른 채 작품을 추출 할 수 없습니다. camello ()의 입력으로 "sanfRancisco"또는 "itSnotcaMelcAse"를 입력하면 출력이 동일하다는 것을 알 수 있습니다.
Patrice Bernassola

오, 알겠습니다. 네 말이 맞아요. 나는 솔루션을 과적 합합니다. 업데이트하겠습니다.
Marc

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.