← Назад к курсу

Работа со строками в 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.