Як я можу записувати рядки в Python?


2054

Чи є спосіб перетворити рядок з верхнього регістру чи навіть частини верхнього регістру в нижній регістр?

Наприклад, "Кілометри" → "кілометри".

Відповіді:



259

Як перетворити рядок у малі регістри в Python?

Чи є якийсь спосіб перетворити цілу рядок, введений користувачем, з великого регістру або навіть частини верхнього регістру в нижній регістр?

Наприклад кілометри -> кілометри

Канонічний піфонічний спосіб зробити це

>>> '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

Це метод str в Python 3, але в Python 2, ви хочете подивитися на PyICU або py2casefold - тут є декілька відповідей .

Unicode Python 3

Python 3 обробляє прості рядкові літерали як unicode:

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

Python 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()
Километр

У сценаріях Python буде заперечувати проти не-ascii (станом на Python 2.5 та попередження в Python 2.4) байтами, що знаходяться в рядку без кодування, оскільки призначене кодування було б неоднозначним. Докладніше про це див. Інструкцію Unicode в документах та PEP 263

Використовуйте літерали Unicode, а не strлітерали

Отже, нам потрібна unicodeрядок для обробки цього перетворення, що виконується легко з літеральним рядком unicode, який роз'єднує з uпрефіксом (і зауважте, що uпрефікс також працює в Python 3):

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

Зауважте, що байти повністю відрізняються від strбайтів - за символом втечі '\u'слідує 2-байтна ширина або 16-бітове представлення цих unicodeлітер:

>>> 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 Python - це універсальний формат кодування, який має багато переваг щодо більшості інших кодувань. Ми можемо або використовувати 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 - такі ж, як і unicode_literal.

Найкраща практика - використання Unicode

Рекомендується завжди працювати з текстом у Unicode .

Програмне забезпечення повинно працювати тільки з рядками Unicode внутрішньо, перетворюючись на певне кодування на виході.

При необхідності може кодувати назад

Однак, щоб повернути малий регістр у тип str, кодуйте рядок python 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 Unicode може кодувати до рядків Python, а рядки Python можуть декодувати в тип Unicode.


У мене є одне зауваження, яке не обов'язково стосується питання щодо ОП, але це важливо при переносимості (інтернаціоналізації), коли проводиться відповідність невідчутливих випадків до справ. Якщо невідчутне до регістру відповідність, діакритики (акценти) можуть стати проблемою. Приклад: >>> "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')це не тільки непотрібно в Python 3, але викликає помилку. ( ref ). Приклад. $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
Питання в тому, як перетворити рядок у малі регістри. Як ця відповідь отримала стільки голосів?
Мунім Мунна

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.