파이썬에서 문자열을 소문자로 어떻게합니까?


답변:



259

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

사용자가 입력 한 전체 문자열을 대문자에서 또는 대문자로 변환하는 방법이 있습니까?

예를 들어 킬로미터-> 킬로미터

이 작업을 수행하는 정식 파이썬 방식은

>>> 'Kilometers'.lower()
'kilometers'

그러나 대소 문자를 구분하지 않고 일치시키는 경우 대소 문자를 사용해야합니다.

>>> 'Kilometers'.casefold()
'kilometers'

이유는 다음과 같습니다.

>>> "Maße".casefold()
'masse'
>>> "Maße".lower()
'maße'
>>> "MASSE" == "Maße"
False
>>> "MASSE".lower() == "Maße".lower()
False
>>> "MASSE".casefold() == "Maße".casefold()
True

이것은 Python 3의 str 메소드이지만 Python 2에서는 PyICU 또는 py2casefold를 보려고 합니다 .

유니 코드 파이썬 3

Python 3 은 일반 문자열 리터럴을 유니 코드로 처리합니다.

>>> string = 'Километр'
>>> string
'Километр'
>>> string.lower()
'километр'

파이썬 2, 일반 문자열 리터럴은 바이트입니다

Python 2에서 아래는 쉘에 붙여 넣어을 사용하여 리터럴을 바이트 문자열로 인코딩합니다 utf-8.

그리고 lower바이트가 알고있는 변경 사항을 매핑하지 않으므로 동일한 문자열을 얻습니다.

>>> string = 'Километр'
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.lower()
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.lower()
Километр

스크립트에서 파이썬은 의도하지 않은 코딩이 모호하기 때문에 인코딩이없는 문자열에 비 ASCII (파이썬 2.5에서와 파이썬 2.4에서 경고) 바이트에 반대합니다. 이에 대한 자세한 내용은 문서PEP 263 의 유니 코드 사용법을 참조하십시오.

유니 코드 리터럴이 아닌 str리터럴

따라서 우리는 unicode이 변환을 처리하기 위해 문자열이 필요합니다 . 유니 코드 문자열 리터럴로 쉽게 달성 할 수 있습니다.이 코드는 u접두사로 명확 해집니다 ( u접두사는 Python 3에서도 작동합니다).

>>> unicode_literal = u'Километр'
>>> print(unicode_literal.lower())
километр

바이트는 바이트와 완전히 다릅니다 str. 이스케이프 문자 '\u'뒤에는 2 바이트 너비 또는이 unicode문자 의 16 비트 표현 이옵니다.

>>> unicode_literal
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> unicode_literal.lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'

이제 형식으로 만있는 경우 str로 변환해야합니다 unicode. 파이썬의 유니 코드 유형은 대부분의 다른 인코딩에 비해 많은 장점 을 갖는 범용 인코딩 형식입니다 . 코덱과 함께 unicode생성자 또는 str.decode메서드를 사용하여를 다음 과 같이 변환 할 str수 있습니다 unicode.

>>> unicode_from_string = unicode(string, 'utf-8') # "encoding" unicode from string
>>> print(unicode_from_string.lower())
километр
>>> string_to_unicode = string.decode('utf-8') 
>>> print(string_to_unicode.lower())
километр
>>> unicode_from_string == string_to_unicode == unicode_literal
True

두 방법 모두 유니 코드 유형으로 변환되며 unicode_literal과 동일합니다.

모범 사례, 유니 코드 사용

항상 유니 코드 텍스트로 작업하는 것이 좋습니다 .

소프트웨어는 내부적으로 유니 코드 문자열로만 작동하여 출력시 특정 인코딩으로 변환해야합니다.

필요할 때 다시 인코딩 가능

그러나 소문자를 type으로 되돌리려 str면 파이썬 문자열을 utf-8다시 인코딩 하십시오.

>>> print string
Километр
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.decode('utf-8')
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower().encode('utf-8')
'\xd0\xba\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.decode('utf-8').lower().encode('utf-8')
километр

따라서 Python 2에서 유니 코드는 Python 문자열로 인코딩 할 수 있고 Python 문자열은 유니 코드 유형으로 디코딩 할 수 있습니다.


OP의 질문에 반드시 적용되는 것은 아니지만 대소 문자를 구분하지 않는 일치를 수행 할 때 이식성 (국제화)에 중요합니다. 대 / 소문자를 구분하지 않으면 분음 부호 (악센트 부호)가 문제가 될 수 있습니다. 예 : 이 질문 에 대한 답변을>>> "raison d'être".casefold(); "raison d'être" 확인하십시오unidecode
bballdave025

198

Python 2에서는 UTF-8의 영어 이외의 단어에는 작동하지 않습니다. 이 경우 decode('utf-8')도움 이 될 수 있습니다.

>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр

8
아마도 우리는 decode('utf-8')파이썬 3에서 불필요 할뿐만 아니라 오류를 일으킨다 고 말함으로써 좀 더 분명해야합니다 . ( 참조 ). 예 : $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'@AaronHall의 탁월한 답변을 참조하여이를 수행하는 두 번째 방법을 볼 수 있습니다. >>>s.casefold() #result: километр
bballdave025

20

또한 일부 변수를 덮어 쓸 수 있습니다.

s = input('UPPER CASE')
lower = s.lower()

이렇게 사용하면 :

s = "Kilometer"
print(s.lower())     - kilometer
print(s)             - Kilometer

호출 될 때만 작동합니다.


10
질문은 문자열을 소문자로 변환하는 방법입니다. 이 답변에 많은 투표권이 있습니까?
Munim Munna

1
s=s.lower()갈 길입니다.
m00lti

1

시도하지 마십시오. 완전히 권장하지 않습니다.

import string
s='ABCD'
print(''.join([string.ascii_lowercase[string.ascii_uppercase.index(i)] for i in s]))

산출:

abcd

아무도 그것을 작성하지 않았 swapcase으므로 사용할 수 있습니다 (대문자는 소문자가되고 그 반대도 마찬가지입니다) (방금 언급 한 경우에 사용해야합니다 (대문자를 대문자로 변환).

s='ABCD'
print(s.swapcase())

산출:

abcd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.