Skip to content

5. Методы работы со строками

Nikolaev Dmitriy edited this page May 13, 2023 · 5 revisions

Строковый тип str в Python используют для работы с любыми текстовыми данными. Python автоматически определяет тип str по кавычкам – одинарным или двойным:

>>> stroka = 'Python'
>>> type(stroka)
<class 'str'>
>>> stroka2 = "code"
>>> type(stroka2)
<class 'str'>

Кроме двойных " и одинарных кавычек ', в Python используются и тройные ''' - в них заключают текст, состоящий из нескольких строк, или программный код:

>>> print('''В тройные кавычки заключают многострочный текст.
Программный код также можно выделить тройными кавычками.''')
В тройные кавычки заключают многострочный текст.
Программный код также можно выделить тройными кавычками.

Длина строки len

Для определения длины строки используется встроенная функция len(). Она подсчитывает общее количество символов в строке, включая пробелы:

>>> stroka = 'python'
>>> print(len(stroka))
6
>>> stroka1 = ' '
>>> print(len(stroka1))
1

Преобразование других типов данных в строку

Целые и вещественные числа преобразуются в строки одинаково, с помощью str:

>>> number1 = 55
>>> number2 = 55.5
>>> stroka1 = str(number1)
>>> stroka2 = str(number2)
>>> print(type(stroka1))
<class 'str'>
>>> print(type(stroka2))
<class 'str'>    

Сложение и умножение строк

Конкатенация - сложение строк. Репликация - умножение строки на целое число

>>> str1 = 'Python'
>>> str2 = ' - '
>>> str3 = 'самый гибкий язык программирования'
>>> print(str1 + str2 + str3)
Python - самый гибкий язык программирования

>>> stroka = '*** '
>>> print(stroka * 5)
*** *** *** *** ***

Подстроки

Оператор in, позволяет проверить, что одна строка находится внутри другой, т.е одна строка является подстрокой другой строки. Например, 'abra' является подстрокой 'abrakadabra':

>>> stroka = 'abrakadabra'
>>> print('abra' in stroka)
True
>>> print('zebra' in stroka)
False

Индексация строк в Python

Для обращения к определенному символу строки используют индекс – порядковый номер элемента. Python поддерживает два типа индексации – положительную, при которой отсчет элементов начинается с 0 и с начала строки, и отрицательную, при которой отсчет начинается с -1 и с конца:

Пример строки P r o g l i b
Положительные индексы 0 1 2 3 4 5 6
Отрицательные индексы -7 -6 -5 -4 -3 -2 -1

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

>>> stroka = 'программирование'
>>> print(stroka[7])
м
>>> print(stroka[-1])
е

Срезы строк (slices)

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

>>> stroka = 'программирование'
>>> print(stroka[7:10])
мир

Диапазон среза [a:b] начинается с первого указанного элемента а включительно, и заканчивается на последнем, не включая b в результат:

>>> stroka = 'программa'
>>> print(stroka[3:8])
грамм

s[x:] - срез от x до конца строки.

s[:y] - срез от начала строки до y.

s[:] - возвращает исходную строку

>>> stroka = 'программa'
>>> print(stroka[3:])
граммa
        
>>> stroka = 'программa'
>>> print(stroka[:4])
прог

>>> stroka = 'позиции не заданы'
>>> print(stroka[:])
позиции не заданы

Помимо диапазона, можно задавать шаг среза. В приведенном ниже примере выбирается символ из стартовой позиции среза, а затем каждая 3-я буква из диапазона:

>>> stroka = 'Python лучше всего подходит для новичков.'
>>> print(stroka[1:15:3])
yoлшв

Шаг может быть отрицательным – в этом случае символы будут выбираться, начиная с конца строки:

>>> stroka = 'это пример отрицательного шага'
>>> print(stroka[-1:-15:-4])
а нт

Срез [::-1] может оказаться очень полезным при решении задач, связанных с палиндромами:

>>> stroka = 'А роза упала на лапу Азора'
>>> print(stroka[::-1])
арозА упал ан алапу азор А

Замена символа в строке

Строки в Python относятся к неизменяемым типам данных. Для замены символа в строке нужно воспользоваться срезами и конкатенацией. Результатом станет новая строка:

>>> stroka = 'mall'
>>> stroka = 'b' + stroka[1:]
>>> print(stroka)
ball

Методы строк

Все методы можно сгруппировать в четыре категории:

  • Преобразование строк.
  • Оценка и классификация строк.
  • Конвертация регистра.
  • Поиск, подсчет и замена символов.

Преобразование строк

Метод join() преобразовывает список или кортеж в строку. При объединении списка или кортежа в строку можно использовать любые разделители:

>>> spisok = ['Я', 'изучаю', 'Python']
>>> stroka = ' '.join(spisok)
>>> print(stroka)
Я изучаю Python

>>> kort = ('Я', 'изучаю', 'Django')
>>> stroka = '***'.join(kort)
>>> print(stroka)
Я***изучаю***Django

Метод split() используется для преобразования строки в список. По умолчанию split() разбивает строку по пробелам, но можно указать любой другой символ:

>>> text = 'это пример текста для преобразования в список'
>>> spisok = text.split()
>>> print(spisok)
['это', 'пример', 'текста', 'для', 'преобразования', 'в', 'список']

>>> text = 'цвет: синий; вес: 1 кг; размер: 30х30х50; материал: картон'
>>> spisok = text.split(';')
>>> print(spisok)
['цвет: синий', ' вес: 1 кг', ' размер: 30х30х50', ' материал: картон']

Метод partition() преобразовывает строку в кортеж. В отличие от split(), partition() учитывает только первое вхождение элемента-разделителя (и добавляет его в итоговый кортеж).

>>> text = 'Python - простой и понятный язык'
>>> kort = text.partition('и')
>>> print(kort)
('Python - простой ', 'и', ' понятный язык')

Оценка и классификация строк

Функции min() и max() являются универсальными и работают не только со строками.

>>> text = '12345'
>>> print(min(text))
1
>>> print(max(text))
5

В Python есть специальные методы для определения типа символов. Они возвращают True, если условие верно и False в противном случае.

isalnum() – определяет, состоит ли исходная строка из букв и цифр.

>>> text = 'abracadabra123456'
>>> print(text.isalnum())
True
>>> text1 = 'a*b$ra cadabra'
>>> print(text1.isalnum())
False

isalpha() – определяет, состоит ли строка только из букв.

>>> text = 'программирование'
>>> print(text.isalpha())
True
>>> text2 = 'password123'
>>> print(text2.isalpha())
False

isdigit() – определяет, состоит ли исходная строка только из цифр. Поскольку вещественные числа содержат точку, а отрицательные – знак минуса, выявить их этим методом не получится.

>>> text = '1234567890'
>>> print(text.isdigit())
True
>>> text2 = '123456789o'
>>> print(text2.isdigit())
False
>>> text = '5.55'
>>> print(text.isdigit())
False
>>> text1 = '-5'
>>> print(text1.isdigit())
False

isnumeric() - определяет, состоит ли строка из дробей или римских цифр.

>>> text = '½⅓¼⅕⅙'
>>> print(text.isdigit())
False
>>> print(text.isnumeric())
True

islower() – определяет, являются ли все буквы исходной строки строчными (имеют нижний регистр).

>>> s1 = 'abc'
>>> s2 = 'abc1$d'
>>> s3 = 'Abc1$D'
>>> print(s1.islower())
>>> print(s2.islower())
>>> print(s3.islower())
True
True
False

isupper() – определяет, являются ли все буквы исходной строки заглавными (имеют верхний регистр).

>>> s1 = 'ABC'
>>> print(s1.isupper())
True
>>> s2 = 'ABC1$D'
>>> print(s2.isupper())
True
>>> s3 = 'Abc1$D'
>>> print(s3.isupper())
False

isspace() – определяет, состоит ли исходная строка только из пробелов.

>>> stroka = '   '
>>> print(stroka.isspace())
True
>>> stroka2 = '  a  '
>>> print(stroka2.isspace())
False

Конвертация регистра

lower() – преобразует все символы имеют нижний регистр.

>>>s = 'FOO Bar 123 baz qUX'
>>>print(s.lower())
foo bar 123 baz qux

upper() – преобразует все символы имеют верхний регистр.

>>>s = 'FOO Bar 123 baz qUX'
>>>print(s.upper())
FOO BAR 123 BAZ QUX

capitalize() – возвращает копию строки s, в которой с заглавной буквы начинается только первое слово предложения, а все остальные имеют нижний регистр.

>>>s = 'foO BaR BAZ quX'
>>>print(s.capitalize())
Foo bar baz qux

swapcase() – преобразует исходный регистр символов на противоположный.

>>>s = 'FOO Bar 123 baz qUX'
>>>print(s.swapcase())
foo bAR 123 BAZ Qux

title() – преобразует первый символ каждого слова в верхний регистр.

>>>s = 'the sun also rises'
>>>print(s.title())
The Sun Also Rises

Поиск, подсчет и замена символов

find(sub, start, end) - находит индекс первого вхождения подстроки sub в исходной строке s. Если строка s не содержит подстроки sub, то метод возвращает значение -1.

>>s = 'foo bar foo baz foo qux'
>>print(s.find('foo'))
0
>>print(s.find('bar'))
4
>>print(s.find('qu'))
20
>>print(s.find('python'))
-1

rfind(sub, start, end) идентичен методу find, за тем исключением, что он ищет первое вхождение подстроки sub начиная с конца строки s.

index(sub, start, end) – идентичен методу find, за тем исключением, что он вызывает ошибку ValueError: substring not found во время выполнения программы, если подстрока sub не найдена.

>>> text = 'Съешь еще этих мягких французских булок!'
>>> print(text.index('еще'))
6
>>> print(text.rindex('чаю'))
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
ValueError: substring not found

rindex(sub, start, end) идентичен методу index, за тем исключением, что он ищет первое вхождение подстроки sub начиная с конца строки s.

startswith(suffix, start, end) – определяет начинается ли исходная строка s подстрокой suffix.

>>> s = 'foobar'
>> print(s.startswith('foo'))
True
>> print(s.startswith('baz'))
False

endswith(suffix, start, end) – определяет заканчивается ли исходная строка s подстрокой suffix.

>>> s = 'foobar'
>> print(s.endswith('bar'))
True
>> print(s.endswith('baz'))
False

count(sub, start, end) – подсчитывает, как общее число вхождений определенного символа или подстроки в тексте, так и вхождения в указанном диапазоне.

>>> s = 'foo goo moo'
>> print(s.count('oo'))
3
>>print(s.count('oo', 0, 8))
2

strip() - удаляет все пробелы стоящие в начале и конце строки.

>>> s = '     foo bar foo baz foo qux      '
>> print(s.strip())
foo bar foo baz foo qux

lstrip() - удаляет все пробелы в начале строки.

rstrip() - удаляет все пробелы в конце строки.

Методы strip(), lstrip(), rstrip() могут принимать на вход опциональный аргумент chars - строка, которая определяет набор символов для удаления.

replace(old, new) - заменяет символ или подстроку old на new.

>>> s = 'foo bar foo baz foo qux'
>> print(s.replace('foo', 'grault'))
grault bar grault baz grault qux

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

>>> s = 'foo bar foo baz foo qux'
>>> print(s.replace('foo', 'grault', 2))
grault bar grault baz foo qux

ljust(width, fillchar) - расширяет справа исходную строку до ширины width (обязательный параметр) и дополняет необязательным параметром 'fillchar' (по умолчанию - пробел).

>>> print(d.ljust(10, '&'))
qwerty&&&&
>>> print(d.ljust(5, '!'))
qwerty

Если параметр width меньше длины строки, то будет возвращена исходная строка без изменений. В параметр fillchar можно передать только строку, состоящую из одного символа. Если передать пустую строку или более одного символа, произойдет ошибка.

Метод rjust(width, fillchar) работает в обратную сторону.

center(width, fillchar) - возвращает новую строку длиной width, где исходная строка s находится в центре, а справа и слева от нее находятся символы fillchar.

>>> print(d.center(12, '!'))
!!!qwerty!!!
>>> print(d.center(13, '?'))
????qwerty???

В параметр fillchar также можно передать только строку, состоящую из одного символа. В случаях, когда количество необходимых для дополнения символов нечетно, слева будет на один символ fillchar больше чем справа.

zfill(width) - дополняет строку нулями слева так, чтобы длина новой строки стала равна width.

>>> print('123'.zfill(5))
00123
>>> print('0.123'.zfill(6))
00.123
Примеры задач

Задание 1. Напишите программу, которая получает на вход строку и выводит:

  • количество символов, содержащихся в тексте;
  • True или False в зависимости от того, являются ли все символы буквами и цифрами.

Решение:

text = input()
print(len(text))
print(text.isalpha())

Задание 2. Напишите программу, которая получает на вход слово и выводит True, если слово является палиндромом, или False в противном случае. Примечание: для сравнения в Python используется оператор ==.

Решение:

text = input().lower()
print(text == text[::-1])

Задание 3. Напишите программу, которая получает строку с именем, отчеством и фамилией, написанными в произвольном регистре, и выводит данные в правильном формате. Например, строка алеКСандр СЕРГЕЕВИЧ ПушкиН должна быть преобразована в Александр Сергеевич Пушкин.

Решение:

text = input()
print(text.title())

Задание 4. Имеется строка 12361573928167047230472012. Напишите программу, которая преобразует строку в текст один236один573928один670472304720один2.

Решение:

text = '12361573928167047230472012'
print(text.replace('1', 'один'))

Задание 5. Напишите программу, которая последовательно получает на вход имя, отчество, фамилию и должность сотрудника, а затем преобразует имя и отчество в инициалы, добавляя должность после запятой.

Пример ввода:

Алексей
Константинович
Романов
бухгалтер

Вывод:

А. К. Романов, бухгалтер

Решение:

first_name, patronymic, last_name, position = input(), input(), input(), input()
print(first_name[0] + '.', patronymic[0] + '.', last_name + ',', position)

Задание 6. Напишите программу, которая получает на вход строку текста и букву, а затем определяет, встречается ли данная буква (в любом регистре) в тексте. В качестве ответа программа должна выводить True или False.

Пример ввода:

ЗонтИК
к

Вывод:

True

Решение:

text = input().lower()
letter = input()
print(letter in text)

Задание 7. Напишите программу, которая определяет, является ли введенная пользователем буква гласной. В качестве ответа программы выводит True или False, буквы могут быть как в верхнем, так и в нижнем регистре.

Решение:

vowels = 'аиеёоуыэюя'
letter = input().lower()
print(letter in vowels)

Задание 8. Напишите программу, которая принимает на вход строку текста и подстроку, а затем выводит индексы первого вхождения подстроки с начала и с конца строки (без учета регистра).

Пример ввода:

Шесть шустрых мышат в камышах шуршат
ша

Вывод:

16 33

Решение:

text, letter = input().lower(), input()
print(text.find(letter), text.rfind(letter))

Задание 9. Напишите программу для подсчета количества пробелов и непробельных символов в введенной пользователем строке.

Пример ввода:

В роще, травы шевеля, мы нащиплем щавеля

Вывод:

Количество пробелов: 6, количество других символов: 34

Решение:

text = input()
nospace = text.replace(' ', '')
print(f"Количество пробелов: {text.count(' ')}, количество других символов: {len(nospace)}")

Задание 10. Напишите программу, которая принимает строку и две подстроки start и end, а затем определяет, начинается ли строка с фрагмента start, и заканчивается ли подстрокой end. Регистр не учитывать.

Пример ввода:

Программирование на Python - лучшее хобби
про
про

Вывод:

True
False

Решение:

text, start, end = input().lower(), input(), input()
print(text.startswith(start))
print(text.endswith(end))
Clone this wiki locally