-
Notifications
You must be signed in to change notification settings - Fork 0
5. Методы работы со строками
Строковый тип str
в Python используют для работы с любыми текстовыми данными. Python автоматически определяет тип str
по кавычкам – одинарным или двойным:
>>> stroka = 'Python'
>>> type(stroka)
<class 'str'>
>>> stroka2 = "code"
>>> type(stroka2)
<class 'str'>
Кроме двойных "
и одинарных кавычек '
, в Python используются и тройные '''
- в них заключают текст, состоящий из нескольких строк, или программный код:
>>> print('''В тройные кавычки заключают многострочный текст.
Программный код также можно выделить тройными кавычками.''')
В тройные кавычки заключают многострочный текст.
Программный код также можно выделить тройными кавычками.
Для определения длины строки используется встроенная функция 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 поддерживает два типа индексации – положительную, при которой отсчет элементов начинается с 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])
е
Индексы позволяют работать с отдельными элементами строк. Для работы с подстроками используют срезы, в которых задается нужный диапазон:
>>> 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))