← Назад к курсу
Работа со строками в Python во всех подробностях
1. Введение в строки
Что такое строка?
Строка (string) - это неизменяемая последовательность символов, представляющая текст.
# Создание строк str1 = 'Одинарные кавычки' str2 = "Двойные кавычки" str3 = """Тройные кавычки для многострочных строк""" str4 = str(123) # Преобразование в строку print(type(str1)) # <class 'str'>
Специальные символы (экранирование)
print("Первая строка\nВторая строка") # \n - новая строка
print("Табуляция\tздесь") # \t - табуляция
print("Кавычки: \"текст в кавычках\"") # \" - двойная кавычка
print('Апостроф: I\'m here') # \' - апостроф
print("Обратный слэш: \\") # \\ - обратный слэш
print("\u03B1") # Юникод символ: α
# Сырые строки (raw strings) - игнорируют экранирование
path = r"C:\Users\Name\Documents"
print(path) # C:\Users\Name\Documents
2. Основные операции со строками
Конкатенация (сложение)
s1 = "Hello"
s2 = "World"
result = s1 + " " + s2
print(result) # Hello World
# Повторение строк
print("Hi" * 3) # HiHiHi
Индексация и срезы
s = "Python" # Индексация (начинается с 0) print(s[0]) # P print(s[1]) # y print(s[-1]) # n (последний символ) print(s[-2]) # o (предпоследний) # Срезы [start:end:step] print(s[0:3]) # Pyt (символы с 0 по 2) print(s[:3]) # Pyt (от начала до 2) print(s[3:]) # hon (с 3 до конца) print(s[::2]) # Pto (каждый второй) print(s[::-1]) # nohtyP (реверс)
3. Методы работы со строками
Проверка содержимого
s = "Python 3.9"
# Проверка типа содержимого
print(s.isalpha()) # False (не все буквы)
print("Python".isalpha()) # True
print("123".isdigit()) # True
print("123abc".isalnum()) # True (буквы и цифры)
print(" ".isspace()) # True
print("Python".islower()) # False
print("PYTHON".isupper()) # True
print("Hello World".istitle()) # True
# Проверка начала/окончания
text = "Hello World"
print(text.startswith("Hello")) # True
print(text.endswith("World")) # True
Поиск в строках
text = "яблоко апельсин яблоко"
# find() - поиск с начала, возвращает индекс или -1
print(text.find("яблоко")) # 0
print(text.find("яблоко", 5)) # 15 (поиск с позиции 5)
print(text.find("банан")) # -1
# rfind() - поиск с конца
print(text.rfind("яблоко")) # 15
# index() - как find(), но вызывает ошибку если не найдено
print(text.index("апельсин")) # 7
# print(text.index("банан")) # ValueError
# count() - подсчет вхождений
print(text.count("яблоко")) # 2
print(text.count("о")) # 4
Модификация строк
# Регистр символов
s = "Python Programming"
print(s.lower()) # python programming
print(s.upper()) # PYTHON PROGRAMMING
print(s.title()) # Python Programming
print(s.capitalize()) # Python programming
print(s.swapcase()) # pYTHON pROGRAMMING
# Выравнивание
text = "Hello"
print(text.ljust(10)) # 'Hello '
print(text.rjust(10, "-")) # '-----Hello'
print(text.center(11, "*")) # '***Hello***'
# Удаление пробелов
text = " Hello World "
print(text.strip()) # 'Hello World'
print(text.lstrip()) # 'Hello World '
print(text.rstrip()) # ' Hello World'
text = "##Hello###"
print(text.strip("#")) # 'Hello'
Замена и разделение
# Замена
text = "Я люблю Java"
print(text.replace("Java", "Python")) # Я люблю Python
print(text.replace("о", "а", 1)) # Я люблю Java (замена только первого)
# Разделение на список
csv = "яблоко,апельсин,банан"
print(csv.split(",")) # ['яблоко', 'апельсин', 'банан']
text = "раз два три"
print(text.split()) # ['раз', 'два', 'три'] (по пробелам)
print(text.split(" ", 1)) # ['раз', 'два три'] (только одно разделение)
# Разделение на строки
multiline = "Первая строка\nВторая строка\nТретья"
print(multiline.splitlines()) # ['Первая строка', 'Вторая строка', 'Третья']
print(multiline.splitlines(keepends=True)) # Сохраняет символы перевода строк
# Объединение списка в строку
words = ["Python", "это", "круто"]
print(" ".join(words)) # Python это круто
print("-".join(words)) # Python-это-круто
4. Форматирование строк
Старый стиль (%)
name = "Анна"
age = 25
print("Меня зовут %s, мне %d лет" % (name, age))
print("Число: %05d" % 42) # 00042
print("Процент: %.2f%%" % 99.555) # 99.56%
Метод format()
# Позиционные аргументы
print("{} + {} = {}".format(2, 3, 5)) # 2 + 3 = 5
# Именованные аргументы
print("{name} is {age} years old".format(name="Alice", age=30))
# Индексы
print("{0} {1} {0}".format("раз", "два")) # раз два раз
# Форматирование чисел
print("Число: {:05d}".format(42)) # 00042
print("Деньги: {:.2f}".format(99.555)) # 99.56
print("Процент: {:.1%}".format(0.75)) # 75.0%
print("Шестнадцатеричное: {:x}".format(255)) # ff
print("Двоичное: {:b}".format(10)) # 1010
# Выравнивание
print("|{:^10}|".format("test")) # | test |
print("|{:<10}|".format("test")) # |test |
print("|{:>10}|".format("test")) # | test|
f-строки (Python 3.6+)
name = "Иван"
age = 30
score = 95.5
print(f"Имя: {name}, Возраст: {age}") # Имя: Иван, Возраст: 30
print(f"Оценка: {score:.1f}") # Оценка: 95.5
print(f"Имя в верхнем регистре: {name.upper()}") # Имя в верхнем регистре: ИВАН
# Выражения внутри f-строк
a, b = 5, 3
print(f"{a} + {b} = {a + b}") # 5 + 3 = 8
# Форматирование с выравниванием
text = "test"
print(f"|{text:^10}|") # | test |
print(f"|{text:<10}|") # |test |
print(f"|{text:>10}|") # | test|
# Форматирование чисел
num = 1234.5678
print(f"{num:,.2f}") # 1,234.57
print(f"{num:.0f}") # 1235
5. Строковые константы и полезные функции
import string
print(string.ascii_letters) # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.ascii_lowercase) # abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase) # ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits) # 0123456789
print(string.hexdigits) # 0123456789abcdefABCDEF
print(string.octdigits) # 01234567
print(string.punctuation) # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
print(string.whitespace) # пробельные символы
# ord() и chr() - работа с кодами символов
print(ord('A')) # 65 (код символа)
print(chr(65)) # 'A' (символ по коду)
print(chr(0x03B1)) # 'α' (греческая альфа)
6. Многострочные строки и docstrings
# Многострочные строки
multiline = """Это многострочная строка.
Она сохраняет переносы строк
и все отступы."""
# Удаление отступов с помощью textwrap.dedent
import textwrap
code = """
def hello():
print("Hello World")
"""
print(textwrap.dedent(code))
# Docstrings (строки документации)
def example_function():
"""
Это docstring функции.
Аргументы:
Нет
Возвращает:
Ничего
"""
pass
print(example_function.__doc__)
7. Экранирование Unicode и байтовые строки
# Unicode escape sequences
print("\N{GREEK SMALL LETTER ALPHA}") # α
print("\u03B1") # α (шестнадцатеричный)
print("\U000003B1") # α (32-битный)
# Байтовые строки
b_string = b"hello" # bytes тип
print(b_string) # b'hello'
print(b_string[0]) # 104 (код ASCII для 'h')
# Кодировка и декодирование
text = "Привет"
utf8_bytes = text.encode('utf-8')
print(utf8_bytes) # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
decoded_text = utf8_bytes.decode('utf-8')
print(decoded_text) # Привет
8. Практические примеры и паттерны
Пример 1: Обработка пользовательского ввода
def clean_user_input(user_input):
"""Очистка пользовательского ввода"""
return user_input.strip().lower().capitalize()
user_text = " анна "
cleaned = clean_user_input(user_text)
print(cleaned) # Анна
Пример 2: Валидация пароля
def validate_password(password):
"""Проверка сложности пароля"""
if len(password) < 8:
return "Пароль слишком короткий"
if not any(c.isupper() for c in password):
return "Добавьте заглавные буквы"
if not any(c.islower() for c in password):
return "Добавьте строчные буквы"
if not any(c.isdigit() for c in password):
return "Добавьте цифры"
return "Пароль надежный"
print(validate_password("Pass123!"))
Пример 3: Генератор случайных строк
import random
import string
def generate_random_string(length=10):
"""Генерация случайной строки"""
letters = string.ascii_letters + string.digits
return ''.join(random.choice(letters) for _ in range(length))
print(generate_random_string(8))
Пример 4: Разбор CSV строки
def parse_csv_line(line, delimiter=','):
"""Разбор строки CSV формата"""
# Учет кавычек и экранирования
import re
pattern = f'{delimiter}(?=(?:[^"]*"[^"]*")*[^"]*$)'
return re.split(pattern, line.strip())
csv_data = 'name,age,city\n"John, Smith",30,"New York"'
for line in csv_data.split('\n'):
print(parse_csv_line(line))
9. Производительность и лучшие практики
Конкатенация vs join
# ПЛОХО (медленно при большом количестве операций)
result = ""
for i in range(1000):
result += str(i)
# ХОРОШО (быстро)
result = "".join(str(i) for i in range(1000))
Проверка на пустую строку
text = ""
# ПЛОХО
if len(text) == 0:
print("Пустая строка")
# ХОРОШО
if not text:
print("Пустая строка")
# Для строк только из пробелов
if text.strip() == "":
print("Пустая или пробельная строка")
10. Упражнения для закрепления
Упражнение 1: Палиндром
def is_palindrome(text):
"""Проверка, является ли строка палиндромом"""
# Убираем пробелы и приводим к нижнему регистру
cleaned = ''.join(c.lower() for c in text if c.isalnum())
return cleaned == cleaned[::-1]
print(is_palindrome("А роза упала на лапу Азора")) # True
Упражнение 2: Подсчет слов
def count_words(text):
"""Подсчет слов в тексте"""
words = text.split()
return len(words)
text = "Python — высокоуровневый язык программирования"
print(f"Слов: {count_words(text)}")
Упражнение 3: Шифр Цезаря
def caesar_cipher(text, shift):
"""Шифр Цезаря"""
result = []
for char in text:
if char.isalpha():
base = ord('А') if char.isupper() else ord('а')
shifted = (ord(char) - base + shift) % 32
result.append(chr(base + shifted))
else:
result.append(char)
return ''.join(result)
message = "Привет, мир!"
encrypted = caesar_cipher(message, 3)
print(f"Зашифровано: {encrypted}")
print(f"Расшифровано: {caesar_cipher(encrypted, -3)}")
Заключение
Строки в Python предоставляют богатый набор методов для работы с текстом. Ключевые моменты:
- Строки неизменяемы, поэтому методы возвращают новые строки
- Используйте f-строки для современного форматирования
- Методы split() и join() эффективны для работы со списками строк
- Помните о кодировках при работе с файлами и внешними данными
- Регулярные выражения (модуль re) расширяют возможности работы с текстом
Этот урок охватывает основные аспекты работы со строками в Python. Для более сложных задач обработки текста изучите модуль re для регулярных выражений и модуль unicodedata для работы с Unicode.