Привет, друзья! Сегодня у нас с вами на рабочем столе урок Python: работа со строками. Сейчас мы изучим некоторые приёмы для работы с ними. Не секрет, что множество программ созданы только для того, чтобы работать с текстами. Преобразовывать, изменять, анализировать. Взять тот же Chat GPT, например. Забегая вперёд, отмечу, что любой, даже очень большой текст можно разбить по предложениям. Или абзацам. И получить на выходе массив (или, лучше сказать, список) строк. Ну, теперь к делу.
Python: работа со строками — замена
Прежде всего, немного терминологии. Вам часто будет встречаться слово «подстрока». Что это такое? Это последовательность символов, которые содержатся в строке. Это может быть слово или словосочетание. А может, даже и целое предложение.
Если это не первый урок, который вы проводите со мной, то, наверное, знаете, как я не люблю примеров, оторванных от реальности. Поэтому представьте себе довольно заурядную ситуацию. Предположим, вы администрируете какой-нибудь чат или форум. Где ругаться, используя бранные слова, само собой, не допускается. Но одних лишь предупреждений пользователям… недостаточно. Чтобы разрешить эту ситуацию, напишем скрипт, который будет менять подстроку, содержащую ругательства на изящные три звездочки: ***
Мы будем использовать функцию replace. Вот, какой у неё синтаксис:
1 |
s = s.replace ('подстрока, которую меняем', 'подстрока, на которую меняем') |
Допустим, мы обнаружили хулигана, который написал ни в чём не виноватому мальчику Ване, что тот редиска. Мы не хотим, чтобы это видели остальные, поэтому слово «редиска» заменим звёздочками.
1 2 3 4 |
s = '''Ах ты редиска! Я, значит, тебе свою палку подарил, а ты меня вот каким дураком выставил!!!''' print(s) s = s.replace ('редиска', '***') print(s) |
Получение части строки
Из строки можно сделать срез, указав начальную и конечную позицию подстроки через двоеточие, в квадратных скобках после имени переменной. При этом позиция начинается с нуля. Опять же, приведу пример из жизни. Часто бывает, что из соображений безопасности (например, при восстановлении пароля), пользователю нужно напомнить его email. Но только не весь целиком, а как бы… намекнуть. Для этого на практике часть символов заменяется точками или звездочками. Функция replace здесь не поможет, потому как мы не знаем, что именно нам надо менять. А вот взять первые и последние три символа, оставив между ними звёздочки — можно.
1 2 3 4 5 6 |
s = '''misha@mail.ru''' print(s) a = s[:3] b = s[-3:] c = a + '***' + b print(c) |
Работа с частью строки бывает веьсма полезной, когда в списках нужно отыскать определённую информацию. Вот ещё один пример. Допустим, есть неупорядоченный список криво (!) выгруженной базы. В этом списке вперемешку и имена, и даты рождения, и адреса электронной почты, и адреса страниц в соцсетях. А перед нами задача — «выцепить» только последние, чтобы потом произвести организованную рассылку сообщений, например. Решение — перебрать при помощи цикла for каждую строку из списка и вывести на экран те, что начинаются с «https:».
1 2 3 4 |
mas = ['https://vk.com/masha','masha@mail.ru','3-я улица строителей','https://ok.ru/mashulya','+7921543232561'] for x in mas: if x[:6] == 'https:': print(x) |
Python: работа со строками — поиск
Чтобы найти подстроку в строке, нужно использовать функцию find. Так, если искомая подстрока обнаружится в строке, то в переменную n попадёт её позиция в поиске. В противном случае, значение n будет равняться -1. Вот синтаксис этой функции:
1 |
n = s.find('Строка, которую мы ищем') |
Где можно применить такую функцию? Например, при проверке (валидации) введённого адреса электронной почты. Примитивной такой валидации 🙂 В любом адресе электронной почты должен присутствовать символ @. Его-то мы и будем искать.
1 2 3 4 5 6 |
s = input('Пожалуйста, введите ваш email: ') n = s.find('@') if n != -1: print('Спасибо!') else: print('Проверьте, пожалуйста, введённый email, похоже, там ошибка.') |
Разделяй и властвуй объединяй
Строки можно как разбивать на части (функция split()), так и объединять (функция join()). Возьмём пример выше и пофантазируем. Программа не будет спрашивать пользователя ввести адрес, она будет работать с уже существующей строкой. Посмотрите на скрипт с комментариями:
1 2 3 4 5 6 |
s = 'Это просто строка, в которой содержится адрес электронной почты masha@mail.ru' # исходная строка words = s.split() # разбиваем строку на слова (разделителем по умолчанию будет пробел) и по кусочкам отправляем в список for w in words: n = w.find('@mail.ru') if n != -1: print('В строке есть email ' + str(w)) |
Функция join() обратна функции split(). Несложно было догадаться, правда? Допустим, у нас есть строковая переменная, которую нужно добавить к каждому элементу из списка. Как это сделать? Взгляните на скрипт:
1 2 3 4 |
str1 = 'Море волнуется ' list1 = ['1', '2', '3'] str1 += str1.join(list1) # равносильно тому, как если бы мы написали str1 = str1 + str1.join(list1) print (str1) |
Python: работа со строками — вставка переменной
На практике очень часто требуется вставить переменную именно в середину строки. При этом сами переменные могут содержать в себе как числа, так и строки. Чтобы не запутаться, когда, где, что и как делать, проще всего воспользоваться так называемыми форматированными строками. И для этого есть 2 способа. Первый — при помощи format.
1 2 3 4 5 |
name = 'Иван Иванов' age = 32 address = '3-я улица Строителей' info = 'Имя: {}. Возраст: {}. Адрес: {}'.format(name, age, address) print (info) |
То же самое можно сделать и со списком. Но тогда синтаксис будет немного другим:
1 2 3 |
data = ['Иван Иванов', 32, '3-я улица Строителей'] info = 'Имя: {}. Возраст: {}. Адрес: {}'.format(*data) print (info) |
Как видите, этот метод весьма удобен при работе со списками. Тогда как первый вариант всегда требует перепроверки, чтобы все элементы были строго на своих местах. А вот второй метод намного более гибкий, поскольку позволяет производить действия прямо «на ходу». Только взгляните:
1 2 3 4 5 |
name = 'Иван Иванов' age = 32 address = '3-я улица Строителей' info = f'Имя: {name}. Возраст: {age//3}. Адрес: {address}' # возраст теперь отобразится меньше в 3 раза print (info) |