Строки в Python — полный гайд для аналитика
Коротко
Строка (str) — неизменяемая последовательность символов. В аналитике строки повсюду: названия колонок, фильтры, парсинг логов, чистка данных. На собеседованиях спрашивают про иммутабельность, срезы, разницу split() и split(' '), методы поиска и замены. Ниже — всё, что нужно знать.
Создание строк
# Одинарные и двойные кавычки — разницы нет
name = 'Карьерник'
query = "SELECT * FROM users"
# Многострочная строка — тройные кавычки
sql = """
SELECT user_id, count(*)
FROM events
GROUP BY 1
"""
# Raw-строка — обратный слэш не экранирует
path = r'C:\Users\data\report.csv'
# 'C:\\Users\\data\\report.csv' — слэши остались как естьМногострочные строки удобны для SQL-запросов и шаблонов. Raw-строки (r"...") — для путей к файлам и регулярных выражений, где \ не должен обрабатываться как escape-символ.
Иммутабельность
Строки в Python нельзя изменить на месте. Любой метод возвращает новую строку, а исходная остаётся прежней.
s = 'hello'
s.upper() # 'HELLO' — новая строка
print(s) # 'hello' — оригинал не изменился
# s[0] = 'H' # TypeError: 'str' object does not support item assignmentЭто принципиальное отличие от списков. Если нужно «изменить» строку — создайте новую и присвойте переменной.
Индексация и срезы
Строка — последовательность, значит работают индексы и срезы. Нумерация с нуля, отрицательные индексы — с конца.
s = 'analytics'
s[0] # 'a'
s[-1] # 's'
s[0:4] # 'anal'
s[:4] # 'anal' — от начала
s[4:] # 'ytics' — до конца
s[::2] # 'aaytc' — каждый второй
s[::-1] # 'scitylana' — строка наоборотСрез s[start:stop:step] возвращает новую строку. stop не включается. s[::-1] — классический способ развернуть строку, про него часто спрашивают.
Основные методы
split и join
line = 'user_id,event,timestamp'
parts = line.split(',')
# ['user_id', 'event', 'timestamp']
' | '.join(parts)
# 'user_id | event | timestamp'
# split() без аргументов — разбивает по любому пробельному символу
# и убирает пустые элементы
' one two three '.split()
# ['one', 'two', 'three']
' one two three '.split(' ')
# ['', '', 'one', '', 'two', '', '', 'three', '', '']split() без аргументов и split(' ') — разные вещи. Без аргументов — умный разбор по любым пробелам. С аргументом — буквальное разбиение, включая пустые строки. На собеседованиях это любят спрашивать.
strip, lstrip, rstrip
raw = ' revenue: 1500000 \n'
raw.strip() # 'revenue: 1500000'
raw.lstrip() # 'revenue: 1500000 \n'
raw.rstrip() # ' revenue: 1500000'
# Можно указать символы для удаления
'###title###'.strip('#') # 'title'strip() убирает пробелы, табуляции, переносы строк с обоих концов. Незаменим при чистке данных из CSV, логов, пользовательского ввода.
replace
s = 'DAU: 3,200, MAU: 45,000'
s.replace(',', '')
# 'DAU: 3200 MAU: 45000'
# Третий аргумент — максимум замен
s.replace(',', '', 1)
# 'DAU: 3200, MAU: 45,000'find и index
email = 'analyst@company.ru'
email.find('@') # 7 — позиция первого вхождения
email.find('xyz') # -1 — не найдено
email.index('@') # 7
# email.index('xyz') # ValueError — бросает исключениеfind() возвращает -1, если не нашёл. index() бросает ValueError. Для безопасного поиска используйте find() или оператор in.
startswith, endswith, upper, lower, count
filename = 'report_2026.csv'
filename.endswith('.csv') # True
filename.startswith('report') # True
'Hello'.upper() # 'HELLO'
'Hello'.lower() # 'hello'
'abracadabra'.count('a') # 5f-строки
Основной способ форматирования строк в современном Python. Подробный разбор — в отдельном гайде по f-строкам. Здесь — суть.
metric = 'conversion'
value = 0.0347
f"{metric}: {value:.1%}"
# 'conversion: 3.5%'
users = 4200
f"Пользователей: {users:,}"
# 'Пользователей: 4,200'Практические примеры
Парсинг CSV-строки:
line = 'user_42,purchase,2026-04-09,990'
user_id, event, date, amount = line.split(',')
amount = int(amount)
# user_id='user_42', event='purchase', amount=990Чистка данных:
raw_values = [' Moscow ', 'moscow', ' MOSCOW\n']
clean = [v.strip().lower() for v in raw_values]
# ['moscow', 'moscow', 'moscow']Извлечение домена из email:
email = 'analyst@yandex.ru'
domain = email.split('@')[1]
# 'yandex.ru'
# Для списка email-ов
emails = ['a@ya.ru', 'b@mail.ru', 'c@ya.ru']
domains = [e.split('@')[1] for e in emails]
# ['ya.ru', 'mail.ru', 'ya.ru']Частые ошибки
Забывают про иммутабельность. Вызывают метод, но не сохраняют результат:
name = ' Anna '
name.strip() # вернул 'Anna', но name всё ещё ' Anna '
name = name.strip() # вот так правильноПутают split() и split(' '). Без аргументов split() — умный разбор: любые пробелы, без пустых элементов. split(' ') бьёт буквально по одному пробелу и оставляет пустые строки. Если парсите текст с неровными пробелами — используйте split() без аргументов.
Вопросы с собеседований
— Строки в Python мутабельные или иммутабельные?
— Иммутабельные. Любая операция (replace, upper, конкатенация) создаёт новый объект. Изменить символ по индексу нельзя — будет TypeError.
— Как развернуть строку?
— Срезом: s[::-1]. Шаг -1 идёт с конца к началу. Также можно ''.join(reversed(s)), но срез быстрее и идиоматичнее.
— В чём разница между find() и index()?
— find() возвращает -1, если подстрока не найдена. index() бросает ValueError. Для безопасного поиска лучше find() или in.
— Чем отличается split() без аргументов от split(' ')?
— split() разбивает по любым пробельным символам (пробел, таб, перенос строки) и убирает пустые элементы. split(' ') бьёт строго по пробелу и оставляет пустые строки между ними.
— Как проверить, содержит ли строка подстроку?
— Оператором in: 'error' in log_line. Возвращает True/False. Для позиции — find() или index().
Больше вопросов по Python, SQL и аналитике — в тренажёре. Примеры вопросов по всем темам — на отдельной странице. Про типы данных — в гайде по типам данных Python.
Открыть тренажёр в Telegram — вопросы по Python, pandas, SQL и аналитике. Бесплатно.
FAQ
Строка — это список символов?
Нет. Строка — отдельный тип str, а не list. Строки поддерживают индексацию и срезы, но не поддерживают присваивание по индексу. Если нужно менять отдельные символы — преобразуйте в список: list(s), измените, затем ''.join(lst).
Как объединить список строк в одну?
Метод join(): ', '.join(['a', 'b', 'c']) даст 'a, b, c'. Вызывается на разделителе, а не на списке — это частый источник путаницы.
Когда использовать raw-строки?
Для регулярных выражений (r'\d+') и путей Windows (r'C:\Users\data'). В raw-строке обратный слэш не экранирует символы, поэтому \n остаётся двумя символами, а не переносом строки.