Программирование • 12 августа 2024 • 5 мин чтения

Строки в Python и методы работы с ними

Строки — один из основных типов данных в Python, их используют для хранения и обработки текстовой информации. Рассмотрим, какие существуют функции и методы работы со строками: разбиение, сложение, умножение и другие.

Что такое строки в Python

Строки — это набор знаков, заключённый в кавычки. В зависимости от выбранного типа кавычек у строк есть разные свойства:

● Одинарные кавычки — ('). Внутри одинарных кавычек можно использовать двойные кавычки без экранирования: 'He said, "Hello!"'. Экранирование строк в Python — это механизм, который позволяет вставлять специальные символы внутри строк, чтобы они интерпретировались буквально, а не как часть синтаксиса языка.
● Двойные кавычки — ("). Внутри двойных кавычек можно использовать одинарные кавычки без экранирования: "She said, 'Hello!'".
● Тройные кавычки — (''' или """). Тройные кавычки позволяют создавать многострочные строки. Их удобно использовать для строк с переносами.

my_string = '''Это многострочная строка.
Мы перенесли текст на следующую строку.'''

В большинстве случаев можно использовать любой тип кавычек в зависимости от удобства и стиля кода.

Чтобы вставить специальный символ в строку, используется обратный слеш (\). Например:

\" - двойная кавычка,
\' - одинарная кавычка,
\\ - обратный слеш,
\n - символ новой строки.
\t - символ табуляции.

my_string = "She said, \"Hello!\""
print(my_string) # Вывод: She said, "Hello!"

Если требуется создать строку, в которой все символы интерпретируются буквально, можно использовать неэкранированные строки с префиксом r или R.

raw_string = r"C:\Program Files\Yandex\Python"
print(raw_string) # Вывод: C:\Program Files\Yandex\Python

Экранирование полезно при работе с регулярными выражениями, путями файловой системы, SQL-запросами и в других случаях, когда нужно точно указать символы в строке.

Операции со строками в Python

Определение длины строки

Выполняется с помощью встроенной функции len(), которая также может использоваться для определения длины списков, кортежей, множеств и других последовательностей. Функция считывает символы, включая пробелы, знаки препинания и специальные символы.

my_string = "Hello, World!"
length = len(my_string)
print(f"Длина строки: {length}")

Чтобы правильно использовать строки в Python, нужно разбираться и в других разделах языка — циклах, функциях, классах и т. д. Этому учат на курсе «Python-разработчик». Также студенты учатся работать с инструментами, которые затем применяют в работе — Git, Nginx, PostgreSQL и другим. Обучение длится 9 месяцев, а после курса вы получите диплом о профессиональной переподготовке.

Доступ по индексу

Позволяет получать отдельные символы или подстроки. Для обхода строки с начала, её символы индексируются с помощью неотрицательных целых чисел. Первый символ имеет индекс 0, второй — индекс 1 и так далее.

my_string = "Hello, World!"
first_char = my_string[0] # Получение первого символа ("H")
second_char = my_string[1] # Получение второго символа ("e")

Для доступа к символам с конца строки можно использовать отрицательные индексы. Последний символ имеет индекс -1, предпоследний — индекс -2 и так далее.

my_string = "Hello, World!"
last_char = my_string[-1] # Получение последнего символа ("!")
second_to_last_char = my_string[-2] # Получение предпоследнего символа ("d")

Срез строки

С помощью срезов можно получать подстроки из строки по заданным индексам. Синтаксис: my_string[start:end], где start — индекс начала среза, а end — индекс конца (не включается). При выходе за границы диапазона возникает ошибка IndexError.

my_string = "Hello, World!"
my_substring = my_string[7:12] # Получение подстроки "World"

Шаг извлечения среза

Срезы строк с шагом в Python позволяют получать подстроки с заданным интервалом между символами. Срезы с шагом выполняются с помощью следующего синтаксиса:

my_string[start:end:step], где
start: индекс начала среза (включительно).
end: индекс конца среза (не включительно).
step: шаг между символами.

Получение каждого второго символа:

my_string = "Hello, World!"
every_second_char = my_string[::2] # Получение "HloWrd"

Получение обратной строки:

reversed_string = my_string[::-1] # Получение "!dlroW ,olleH"

Получение части строки с определенным шагом:

my_substring = my_string[1:10:3] # Получение "e,Wl"

Если start и end не указаны, срез будет включать всю строку.

Сложение

Сложение строк в Python (конкатенация) — это процесс объединения двух или более строк в одну. Самый простой способ конкатенации строк — использовать оператор +.

Пример:
first_name = "Ivan"
last_name = "Ivanov"
full_name = first_name + " " + last_name
print(full_name) # Вывод: Ivan Ivanov

Более универсальный способ — метод join(), он позволяет объединить элементы последовательности (например, списка) с помощью заданной строки.

Пример:
words = ["Hello", "world"]
# Соединяем все строки из списка words в одну строку. В качестве разделителя берем простой пробел
sentence = " ".join(words)
print(sentence) # Вывод: Hello world

Вычитание

В Python нельзя вычитать строки, используя знак минуса. Но если под вычитанием подразумевается удаление подстроки из строки, сделать это можно при помощи метода .replace(). В общем случае он применяется для замены подстроки в строке другой подстрокой.

Синтаксис:

string.replace(old, new, count)

old (обязательный параметр): подстрока, которую нужно заменить.

new (обязательный параметр): подстрока, которой мы хотим заменить old.

count (опциональный параметр): максимальное допустимое количество замен. Если не указан, будут заменены все вхождения.

Удаление из строки содержащейся в ней подстроки:

string1 = 'PRAKTIYZKUM'
string2 = 'YZ'
if string2 in string1:
string3 = string1.replace(string2,'')
print(string3) # Вывод: "PRAKTIKUM"

Замена одной подстроки на другую:

original_string = "Hello, World!"
modified_string = original_string.replace("Hello", "Hi")
print(modified_string) # Вывод: "Hi, World!"

Замена всех вхождений:

sentence = "Python is amazing and Python is powerful"
updated_sentence = sentence.replace("Python", "Programming")
print(updated_sentence)
# Вывод: "Programming is amazing and Programming is powerful"

Ограничение количества замен:

text = "kiwi apple apple apple orange apple apple"
updated_text = text.replace("apple", "banana", 2) # Заменяем первые 2 вхождения
print(updated_text) # Вывод: "kiwi banana banana apple orange apple apple"

Дублирование

Строки в Python можно и умножать на числа — дублировать. Это полезно, например, при создании повторяющихся шаблонов или форматировании вывода. Самый простой способ дублирования строки — использовать оператор умножения (*).

original_string = "Hello"
duplicated_string = original_string * 3 # Дублируем строку 3 раза
print(duplicated_string) # Вывод: HelloHelloHello

Методы строк в Python

Используя .split() в питоне, строку можно разделить на подстроки на основе заданного разделителя. Например, можно разбить предложение на слова. Это полезно при анализе логов, чтении CSV-файлов или URL-адресов. Синтаксис:

string.split(separator, maxsplit)

separator (обязательный параметр): строка-разделитель — по умолчанию пробел.

maxsplit (опциональный параметр): максимальное количество разделений. Если не указан, все вхождения разделителя будут использованы.

Разделение строки по пробелам:

my_string = "Hello World"
words = my_string.split() # Разделение по пробелам
print(words) # Вывод: ['Hello', 'World']

Разделение строки по запятой:

csv_data = "apple,banana,orange"
fruits = csv_data.split(",") # Разделение по запятой
print(fruits) # Вывод: ['apple', 'banana', 'orange']

Ограничение количества разделений:

sentence = "Python is amazing and Python is powerful"
words = sentence.split(" ", 2) # Разделение по пробелам, максимум 2 разделения
print(words) # Вывод: ['Python', 'is', 'amazing and Python is powerful']

Иногда надо очистить строку от лишних пробельных символов (пробелов, табуляций, символов новой строки). В этом поможет метод .strip(). Синтаксис:

string.strip([characters])

characters (опциональный параметр): строка, содержащая символы, которые нужно удалить. Если не указан, будут удалены все начальные и конечные пробельные символы. Удаление пробелов в начале и конце строки:

my_string = " Hello, World! "
cleaned_string = my_string.strip()
print(cleaned_string) # Вывод: "Hello, World!"

Удаление символов новой строки:

multiline_string = "\n\nThis is a multiline string.\n\n"
cleaned_multiline = multiline_string.strip("\n")
print(cleaned_multiline)
# Вывод:
# "This is a multiline string."

Принадлежность строки

Если менять подстроку не нужно, а требуется только найти её в исходной строке, на помощь придёт метод .find(). Он возвращает индекс первого вхождения этой подстроки.

Синтаксис:

string.find(substring, start, end)

substring (обязательный параметр): подстрока, которую нужно найти.

start (опциональный параметр): индекс, с которого начинается поиск. По умолчанию поиск идёт с начала строки.

end (опциональный параметр): индекс, на котором заканчивается поиск. По умолчанию поиск идёт до конца строки.

Поиск подстроки в строке:

my_string = "Python is amazing and Python is powerful"
index = my_string.find("amazing")
print(index) # Вывод: 10 (позиция слова "amazing")

Поиск с указанием начальной позиции:

my_string = "Python is amazing and Python is powerful"
index = my_string.find("Python", 15) # Ищем "Python" начиная с позиции 15
print(index) # Вывод: 28 (позиция второго вхождения "Python")

Поиск с ограничением диапазона:

my_string = "Python is amazing and Python is powerful"
index = my_string.find("Python", 0, 15) # Ищем "Python" только в первых 15 символах
print(index) # Вывод: 0 (позиция первого вхождения "Python")

Проверить, содержится ли одна строка внутри другой, можно при помощи оператора in:

my_string = "Hello, World!"
if "World" in my_string:
print("Содержит подстроку 'World'")

Или же наоборот можно убедиться в том, что такая строка не содержится внутри исследуемой:

if "Python" not in my_string:
print("Не содержит подстроку 'Python'")

Вставка значений в строки

В Python символ % используется для интерполяции строк, позволяя вставлять значения переменных в другие строки. Этот процесс называется “старым форматированием строк”. Синтаксис: string % values. В строке string используются специальные символы, такие как %s (для строк) и другие.

name = "Alice"
age = 47
message = "My name is %s and I am %d years old." % (name, age)
print(message) # Вывод: "My name is Alice and I am 47 years old."

Форматы для интерполяции:

%s: вставка строки,
%d: вставка целого числа,
%f: вставка числа с плавающей точкой,
%x: вставка шестнадцатеричного числа.

Вместо % можно использовать {} и метод .format() для более современного форматирования строк.

name = "Bob"
age = 70
message = "My name is {} and I am {} years old.".format(name, age)
print(message) # Вывод: "My name is Bob and I am 70 years old."

В этом примере переменные вставляются в строку в том порядке, в котором они указаны в скобках. Для более чёткого форматирования мы можем использовать именованные аргументы:

name = "Bob"
age = 25
message = "My name is {name} and I am {age} years old.".format(name=name, age=age)
print(message) # Вывод: "My name is Bob and I am 70 years old."

Как и в старом форматировании, мы можем строго указать формат для вставляемых значений:

price = 19.993
formatted_price = "The price is {:.2f} dollars.".format(price)
print(formatted_price) # Вывод: "The price is 19.99 dollars."

Начиная с Python 3.6 можно удобно форматировать строки, используя f-strings. Они позволяют вставлять значения переменных непосредственно в строку, делая код более читаемым и удобным. F-строки создаются путем добавления префикса f или F перед строкой. Внутри f-строки можно использовать фигурные скобки {} для вставки значений переменных.

name = "Alice"
age = 30
message = f"My name is {name} and I am {age} years old."
print(message) # Вывод: "My name is Alice and I am 47 years old."

Внутри фигурных скобок можно указывать выражения, переменные и даже вызывать методы:

price = 19.993
formatted_price = f"The price is {price:.2f} dollars."
print(formatted_price) # Вывод: "The price is 19.99 dollars."

F-строки поддерживают именованные аргументы для более ясного форматирования:

fruit1 = "apple"
fruit2 = "banana"
sentence = f"I like {fruit1} and {fruit2}."
print(sentence) # Вывод: "I like apple and banana."

Внутри f-строк можно выполнять вычисления в пределах фигурных скобок:

x = 5
y = 7
result = f"{x} + {y} = {x + y}"
print(result) # Вывод: "5 + 7 = 12"

Работа с кодировками

Работа с разными кодировками в Python важна при обработке текстовых данных, файлов, сетевых запросов и в других сценариях. В Python строки представляют собой последовательность символов, и каждый символ имеет свой числовой код (кодировку).
По умолчанию строки используют кодировку UTF-8, которая поддерживает множество символов из разных языков.

В Python при чтении или записи файла мы можем указать нужную кодировку. Например,

with open("myfile.txt", "r", encoding="utf-8") as file:
content = file.read()

Строки в Python бывают байтовыми. Они представляют собой последовательность символов от 0 до 255 и используются в работе с бинарными данными, например, изображениями, аудиофайлами, сетевыми пакетами и другими низкоуровневыми ресурсами. Байтовые строки создаются с помощью префикса b перед строкой.

my_bytes = b"Hello, World!"

Байты можно индексировать и использовать срезы так же, как и в обычных строках:

my_bytes = b"Hello, World!"
first_byte = my_bytes[0] # Получение первого байта
slice_of_bytes = my_bytes[2:5] # Получение среза байтов

Байты поддерживают некоторые методы, такие как .find(), .count(), .startswith(), .endswith() и другие:

my_bytes = b"Hello, World!"
index = my_bytes.find(b"World") # Поиск подстроки в байтах
count = my_bytes.count(b"l") # Подсчет вхождений байта

Преобразование между строками и байтами:

● Метод .encode() преобразует строку в байты с заданной кодировкой (например, UTF-8).
● Метод .decode() обратно преобразует байты в строку.

my_string = "Привет, мир!"
my_bytes = my_string.encode("utf-8") # Преобразование в байты
decoded_string = my_bytes.decode("utf-8") # Обратное преобразование в строку

Примеры кода

Два примера программ, в которых вместе используются некоторые из упомянутых методов и возможностей строк.

Пример 1.

def clean_string(input_string):
"""
Функция удаляет лишние пробелы и переводит заглавные буквы в нижний регистр

Аргументы:
input_string (str): строка, которую нужно обработать

Результат функции:
str: обработанная строка.
"""
# Убираем пробелы из начала и конца строки
cleaned_string = input_string.strip()

# Убираем лишние пробелы внутри строки
cleaned_string = ' '.join(cleaned_string.split())

# Переводим буквы из верхнего регистра в нижний
cleaned_string = cleaned_string.lower()

return cleaned_string

# Пример использования
user_input = input("Введите строку: ")
result = clean_string(user_input)
print("Результат обработки:", result)

Пример 2.

def convert_and_remove_bytestring(bytestring):
"""
Функция превращает байтовую строку в обычную и удаляет все вхождения слова “байт”

Аргументы:
bytestring (bytes): байтовая строка

Результат:
str: Обработанная обычная строка
"""
try:
# Байтовая строка конвертируется в обычную с применением кодировки UTF-8
decoded_string = bytestring.decode("utf-8")

# Удаляем все вхождения слова “байт”
cleaned_string = decoded_string.replace("byte", "")

return cleaned_string
except UnicodeDecodeError:
# Если декодировать байтовую строку не получается, возвращаем сообщение об ошибке
return "Error: Unable to decode the bytestring."

# Пример использования
user_input = input("Введите строку: ")
result = convert_and_remove_bytestring(user_input.encode("utf-8"))
print("Обработанная строка:", result)

Статью подготовили:
Богдан Сиротич
Яндекс Практикум
Редактор
Полина Овчинникова
Яндекс Практикум
Иллюстратор

Дайджест блога: ежемесячная подборка лучших статей от редакции

Поделиться

Успейте начать учебу в Практикуме до конца ноября со скидкой 20%

Thu Sep 26 2024 04:12:29 GMT+0300 (Moscow Standard Time)