Строки в 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

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.

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