Строки в 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')  # 5
Закрепи Python для аналитика
200+ задач по pandas, numpy и работе с данными — с разборами
Тренировать Python в браузере

f-строки

Основной способ форматирования строк в современном 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.

Открыть тренажёр в браузере — вопросы по 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 остаётся двумя символами, а не переносом строки.