Строки и символы в языке Python
Основные операции со строками и символами
Как получить доступ к отдельному символу в строке?
Строка в Python представляет собой неизменяемую последовательность символов Unicode. Доступ к символу осуществляется по индексу (начиная с 0) или с использованием среза.
s = 'Привет'
print(s[0]) # 'П'
print(s[-1]) # 'т'Python строка символ (строка и символы в python)
Для получения подстроки применяют срез: s[1:4] вернет 'рив'.
Ошибка: запрос индекса, выходящего за границы строки, вызывает IndexError. Перед обращением проверяйте длину строки функцией len().
Как преобразовать строку к верхнему или нижнему регистру?
Используйте методы .upper() и .lower(). Они создают новую строку, исходная не меняется.
s = 'Python'
print(s.upper()) # 'PYTHON'
print(s.lower()) # 'python'Методы не изменяют символы, для которых нет регистра (цифры, знаки). Работают корректно с Unicode.
Как проверить, из каких символов состоит строка?
Для проверки типа символов применяют .isalpha(), .isdigit(), .isalnum() и другие.
'abc'.isalpha() # True
'123'.isdigit() # True
'a1'.isalnum() # True
' '.isspace() # TrueЭти методы возвращают False для пустой строки. Для проверки каждого символа потребуется цикл.
Как получить числовой код символа и обратно?
Функция ord() возвращает Unicode-код символа, chr() преобразует код обратно в символ.
print(ord('A')) # 65
print(chr(97)) # 'a'Ошибка TypeError возникает, если передать строку из нескольких символов. ord() принимает только один символ.
Расширенные примеры работы со строками
Ниже приведены нетривиальные примеры обработки строк и символов.
Итерация по символам с генерацией списка кодов
s = 'Привет'
codes = [ord(ch) for ch in s]
print(codes)[1055, 1088, 1080, 1074, 1077, 1090]
Проверка, является ли строка палиндромом
def is_palindrome(text):
cleaned = ''.join(ch.lower() for ch in text if ch.isalnum())
return cleaned == cleaned[::-1]
print(is_palindrome('А роза упала на луну Азора'))True
Замена всех символов с помощью str.translate
trans_table = str.maketrans({'а': '@', 'е': '3'})
text = 'атлант'
print(text.translate(trans_table))@тл@нт
Работа с Unicode и эмодзи
emoji_symbol = chr(0x1F600)
print(emoji_symbol) # ?
# Длина эмодзи может быть больше одного символа (суррогатные пары)
print(len(emoji_symbol)) # 2 (в Python строки из Unicode, но некоторые эмодзи кодируются двумя кодовыми точками)Разделение строки на символы с учётом кластеров графем (библиотека regex)
Для корректного разбиения строки на видимые символы (например, эмодзи с комбинирующими символами) требуется модуль regex с флагом VERSION1.
import regex
text = 'ç' # c + комбинирующая седилья
chars = regex.findall(r'\X', text)
print(chars) # ['ç'] - один кластерСравнение строк без учёта регистра и диакритики
import unicodedata
def normalize_caseless(text):
return unicodedata.normalize('NFKD', text.casefold())
print(normalize_caseless('Café') == normalize_caseless('CAFÉ')) # TrueФорматирование строк с помощью f-строк и методов format
name = 'Иван'
age = 30
print(f'{name:>10} {age:03d}')
print('{1} - {0}'.format(age, name))Иван 030 Иван - 30