Str Python. Строки в Python

Основы

Одним из самых распространённых типов данных является строковый. Вопреки расхожему мнению, программист чаще сталкивается не с числами, а с текстом. В Python, как известно, всё является объектами. Не исключение и строки – это объекты, состоящие из набора символов. Естественно, в языке существует широкий набор инструментов для работы с этим типом данных.

Строковые операторы

Операторы «+» и «*» в Питоне применимы не только к числам, но и к строкам.

Оператор сложения строк +

Оператор «+» выполняет операцию, называемую конкатенацией, — объединение строк.

Пример:

var_1 = 'Привет,'
var_2 = 'Python!'
print(var_1 + ' ' + var_2)
# Вывод:

Привет, Python!

Можно и так:

var_1 = 'Привет, '
var_2 = 'Python!'
var_1 += var_2
print(var_1)
# Вывод:

Привет, Python!

Оператор умножения строк *

Оператор «*» дублирует строку указанное количество раз.

Пример:

var_1 = 'O_o '
var_2 = 10
print(var_1 * var_2)
# Вывод:

O_o O_o O_o O_o O_o O_o O_o O_o O_o O_o

Это работает только с целочисленными множителями. Если умножить на ноль или отрицательное число, результатом будет пустая строка. Но лучше так не делать.

var_1 = 'O_o'
[print('При множителе', i, 'получаем строку: "' + var_1 * i + '"') for i in range(-1, 2)]
# Вывод:

При множителе -1 получаем строку: ""

При множителе 0 получаем строку: ""

При множителе 1 получаем строку: "O_o"

Оператор принадлежности подстроки in

Если надо проверить, содержится ли подстрока в строке, удобно пользоваться оператором “in”

var_1 = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id,
fuga, earum consequuntur magni accusamus nihil ipsum qui. Facere,
error velit possimus qui dolorum dolorem illum voluptates nemo pariatur ea. Temporibus.
'''
print('ipsum' in var_1)
# Вывод:

True

Так же можно использовать этот оператор с «not» для инвертирования результата.

var_1 = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id,
fuga, earum consequuntur magni accusamus nihil ipsum qui. Facere,
error velit possimus qui dolorum dolorem illum voluptates nemo pariatur ea. Temporibus.
'''
print('тру-ля-ля' not in var_1)
# Вывод:

True

Встроенные функции строк в python

Пайтон содержит ряд удобных встроенных функций для работы со строками.

Функция ord() возвращает числовое значение символа, при чём, как для кодировки ASCII, так и для UNICODE.

print('A', ord('A'))
print('А русская', ord('А'))
print('~', ord('~'))
print('1', ord('1'))  # Обратите внимание, что здесь единица является именно строкой
# Вывод:

A 65

А русская 1040

~ 126

1 49

Функция chr(n) возвращает символьное значение для данного целого числа, то есть выполняет действие обратное ord().

from random import randint

for i in range(10):
[print(chr(randint(0, 8000)), end=' ') for i in range(10)]
print('')
# Вывод:

૸ ச ઘ ᔝ ዱ છ ᐝ § ඗ ֹ

ၹ ሌ ᔭ ཋ ٺ ຝ ྅ ᒊ ֚ ᴠ

д ߀ Ỽ Ů ጼ ̼ ᅌ ᶥ ḿ ᇶ

ᴗ ȹ ཱི ๤ ൉ ᥈ Ҥ Р ᇑ ਴

ސ ਋ ϯ ኊ ᠻ ដ ࡯ ᄖ ᓣ ᆧ

ଯ ᑟ ߂ ޸ ൢ ԝ ᤵ ඡ ᴼ ႊ

ᥒ ᜭ ˽ ä ؑ ૧ ᅈ ഉ ौ ଦ

ᔚ ॓ ௵ ᥰ ɵ ຘ Ἵ ৓ ᨃ ང

ᬇ ᳓ ᕈ ᳖ ૓ ࣝ ˼ ʋ ં გ

? ᓀ ځ ื ᚢ Ӌ ဃ ᡹ ؅ ႔

Функция len() возвращает количество символов в строке.

from random import randint

for i in range(10):
var = [chr(randint(500, 800)) for i in range(randint(10, 20))]
print(len(''.join(var)), ''.join(var))
# Вывод:

11 ˫ʸɹʄˈȺȨȪȍʮ˴

16 ȷ˝ȁɚ˷Ⱥʾ̂ʨʗȍɺɹ˫̓ȼ

13 əʼɒȞʪɗʍ̍ˡɮɫȉʙ

10 ʜ˧ˬɆ˃əȃ̚ʰ̏

12 ˤ˾ʀɨȷˌɏʿɴȨ˲ȟ

13 ˌʡ˝ȭʪɈ˾ʵȋɎʋ˿ʍ

13 ˜̃ȱ̇ˋ˂ʡȞȍ̄ʭȌʣ

14 ̙ɸɎˈ̀ȾȠ˞ȒɇʀɈȁȫ

20 ȞȎʯɐʪəʔȆʳȨɦʚ˾Ǵȁɕˋ˘̈˭

12 ʷɱ̄˺ʽʤɳȂȗʍˉɦ

 Функция str() возвращает строковое представление объекта.

from math import inf, e, pi

print(str(...))
print(str(inf))
print(str(e))
print(str(pi))
print(str(10 + 11))
print(str(10 + 11j))
print(str(None))
print(str(1 == 1))
# Вывод:

Ellipsis

inf

2.718281828459045

3.141592653589793

21

(10+11j)

None

True

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

Строка является упорядоченной последовательностью символов. Другими словами, она состоит из символов, стоящих в определённом порядке. Благодаря этому, к символу можно обратиться по его порядковому номеру. Для этого надо указать номер символа в квадратных скобках. Нумерация начинается с нуля (0 – это первый символ).

var = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Consequuntur, eligendi, aperiam, consequatur, perferendis
non sequi voluptates asperiores soluta quam ad id beatae
facere aut quod libero dignissimos inventore nesciunt commodi.'''
print(var[0])
print(var[10])
print(var[33])
# Вывод:

L

m

c

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

var = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Consequuntur, eligendi, aperiam, consequatur, perferendis
non sequi voluptates asperiores soluta quam ad id beatae
facere aut quod libero dignissimos inventore nesciunt commodi.'''
print(var[330])
# Вывод:

Traceback (most recent call last):

File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.2\scratches\scratch.py", line 7, in <module>

print(var[330])

IndexError: string index out of range

 

Process finished with exit code 1

В качестве индекса может быть использовано отрицательное число. В этом случае индексирование начинается с конца строки: -1 относится к последнему символу, -2 к предпоследнему и так далее.

var = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Consequuntur, eligendi, aperiam, consequatur, perferendis
non sequi voluptates asperiores soluta quam ad id beatae
facere aut quod libero dignissimos inventore nesciunt commodi.'''
print(var[-1])
print(var[-10])
print(var[-33])
# Вывод:

.

t

s

Срезы строк

В Python существует механизм срезов коллекций. Срезы позволяют обратиться к подстроке используя индексы. Для этого надо в квадратных скобках указать: [начальный индекс : конечный индекс : шаг]. Каждый из параметров является необязательным. Поскольку строка это коллекция, срезы применимы и к ней.

var = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Consequuntur, eligendi, aperiam, consequatur, perferendis
non sequi voluptates asperiores soluta quam ad id beatae
facere aut quod libero dignissimos inventore nesciunt commodi.'''
print(var[-1: 50: -3])
print(var[10:-160])
print(var[::-33])
# Вывод:

.ootieetv msg elo ara   ea   ual rrssauvuso   snee,tqn ae dgernqn    i

m dolor sit amet, consectetur adipisicing elit.

Consequuntur, eligendi, aperiam, co

.s r a n

Форматирование строки

В Python есть функция форматирования строки, которая официально названа литералом отформатированной строки, но обычно упоминается как f-string.

Главной особенностью этой функции является возможность подстановки значения переменной в строку.

Чтобы это сделать с помощью f-строки необходимо:

  • Указать f или F перед кавычками строки (что сообщит интерпретатору, что это f-строка).
  • В любом месте внутри строки вставить имя переменной в фигурных скобках ({ }).

var = 10 * 254 // 77 % 5 ** 5
var_2 = f'Вот что получилось {var}'
print(var_2)
# Вывод:

Вот что получилось 32

Изменение строк

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

  • Использовать перезапись значения переменной

var = 'Что-то '
var += 'и что-то ещё'
print(var)
var = var[:16] + 'новое'
print(var)
# Вывод:

Что-то и что-то ещё

Что-то и что-то новое

  • Использовать встроенный метод replace(x, y):

var = 'Что-то '
print(var.replace('то ', 'нибудь'))
print(var)
# Вывод:

Что-нибудь

Что-то

Как Вы можете видеть, данный метод не меняет строку, а возвращает изменённую копию.

Встроенные методы строк в Python

Поскольку строка в Пайтон – это объект, у него есть свои методы. Методы – это те же самые функции, просто они «закреплены» за объектами определённого класса.

Изменение регистра строки

Если Вам надо изменить регистр строки, удобно использовать один из следующих методов

capitalize() переводит первую букву строки в верхний регистр, остальные в нижний.

var = 'abracadabra'
print(var.capitalize())
print(var)
# Вывод:

Abracadabra

abracadabra

Не алфавитные символы не изменяются:

var = '_abracadabra'
print(var.capitalize())
print(var)
# Вывод:

_abracadabra

_abracadabra

lower() преобразует все буквенные символы в строчные.

var = 'AbRaCAdAbRa'
print(var.lower())
print(var)
# Вывод:

abracadabra

AbRaCAdAbRa

swapcase() меняет регистр на противоположный.

var = 'AbRaCAdAbRa'
print(var.swapcase())
print(var)
# Вывод:

aBrAcaDaBrA

AbRaCAdAbRa

title() преобразует первые буквы всех слов в заглавные

var = 'я пРосТо ПРИМЕР'
print(var.title())
var = 'я @странный _ПРИМЕР'
print(var.title())
print(var)
# Вывод:

Я Просто Пример

Я @Странный _Пример

я @странный _ПРИМЕР

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

var = 'я пРосТо ПРИМЕР'
print(var.upper())
var = 'я @странный _ПРИМЕР'
print(var.upper())
print(var)
# Вывод:

Я ПРОСТО ПРИМЕР

Я @СТРАННЫЙ _ПРИМЕР

я @странный _ПРИМЕР

Найти и заменить подстроку в строке

Эти методы предоставляют различные способы поиска в целевой строке указанной подстроки.

Каждый метод в этой группе поддерживает необязательные аргументы start и end. Они задают диапазон поиска: действие метода ограничено частью целевой строки, начинающейся в позиции символа start и продолжающейся вплоть до позиции символа end, но не включая его. Если start указано, а end нет, метод применяется к части строки от start до конца.

count() подсчитывает количество точных вхождений подстроки в строку.

var = 'Ололо'
print(var.count('ол'))
# Вывод:

1

endswith() определяет, заканчивается ли строка заданной подстрокой.

var = 'Олололололо'
print(var.endswith('оло'))
print(var.endswith('ол', 5, 10))
# Вывод:

True

True

find() ищет в строке заданную подстроку. Возвращает первый индекс который соответствует началу подстроки. Если указанная подстрока не найдена, возвращает -1.

var = 'Олололололо'
print(var.find('оло'))
print(var.find('лОл'))
# Вывод:

2

-1

index() ищет в строке заданную подстроку.

Этот метод идентичен find(), за исключением того, что он вызывает исключение ValueError, если подстрока не найдена.

var = 'Олололололо'
print(var.index('лОл'))
# Вывод:

Traceback (most recent call last):

File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.2\scratches\scratch.py", line 3, in <module>

print(var.index('лОл'))

ValueError: substring not found

 

Process finished with exit code 1

rfind() ищет в строке заданную подстроку, начиная с конца.

Возвращает индекс последнего вхождения подстроки, который соответствует её началу.

var = 'Олололололо'
print(var.rfind('оло'))
# Вывод:

8

rindex() ищет в строке заданную подстроку, начиная с конца.

Этот метод идентичен rfind(), за исключением того, что он вызывает исключение ValueError, если подстрока не найдена.

startswith() определяет, начинается ли строка с заданной подстроки.

var = 'Олололололо'
print(var.startswith('Оло'))
# Вывод:

True

Классификация строк

Методы в этой группе классифицируют строку на основе символов, которые она содержит.

isalnum() возвращает True, если строка не пустая, а все ее символы буквенно-цифровые (либо буква, либо цифра).

var = 'Олололололо'
print(var.isalnum())
# Вывод:

True

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

isdigit() определяет, состоит ли строка из цифр.

isidentifier() определяет, является ли строка допустимым идентификатором (название переменной, функции, класса и т.д.) Python.

var = 'print'
print(var.isidentifier())
# Вывод:

True

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

Вы можете проверить, является ли строка ключевым словом Python, используя функцию iskeyword(), которая находится в модуле keyword.

Если вы действительно хотите убедиться, что строку можно использовать как идентификатор Питон, вы должны проверить, что isidentifier() = True и iskeyword() = False.

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

isprintable() определяет, состоит ли строка только из печатаемых символов.


print('qwerty'.isidentifier())
print(chr(7).isidentifier())
# Вывод:

True

False

Это единственный метод данной группы, который возвращает True, если строка не содержит символов. Все остальные возвращаются False.

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

Тем не менее есть несколько символов ASCII, которые считаются пробелами. И если учитывать символы Юникода, их еще больше:

‘\f’ и ‘\r’ являются escape-последовательностями для символов ASCII; ‘\u2005’ это escape-последовательность для Unicode.

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

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

Выравнивание строк, отступы

Методы из данной группы управляют отображением строки.

center() выравнивает строку по центру.

print('qwerty'.center(50))
print((' ' * 22 + 'qwerty' + ' ' * 22))
print((' ' * (25 - int(len('qwerty') / 2)) + 'qwerty' + ' ' * (25 - int(len('qwerty') / 2)) == ('qwerty'.center(50))))
# Вывод:

                       qwerty                      
                       qwerty                      
True

Если указан необязательный аргумент fill, он используется как символ заполнения:

print('qwerty'.center(50, '='))
# Вывод:

======================qwerty======================

Если строка больше или равна указанной ширине, строка возвращается без изменений:

print('qwerty'.center(6, '='))
# Вывод:

qwerty

expandtabs()  заменяет каждый символ табуляции (‘\t’) пробелами. По умолчанию табуляция заменяются на 8 пробелов.

tabsize необязательный параметр, задающий количество пробелов.

ljust() выравнивание по левому краю.

lstrip() удаляет переданные в качестве аргумента символы слева. По умолчанию это пробелы.

print('__init__.py'.lstrip('_'))
# Вывод:

init__.py

replace() заменяет вхождения подстроки в строке.

var = 'Hello, C! Hello, JS! Hello, Python!'
print(var.replace('C', 'PHP'))
# Вывод:

Hello, PHP! Hello, JS! Hello, Python!

Необязательный аргумент count, указывает количество замен, которое нужно осуществить:

var = 'Hello, C! Hello, JS! Hello, Python!'
print(var.replace('Hello', 'Bye', 2))
# Вывод:

Bye, C! Bye, JS! Hello, Python!

rjust() выравнивание по правому краю строки в поле.

rstrip() обрезает пробельные символы.

strip() удаляет символы с левого и правого края строки.

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

var = 'Hello, C! Hello, JS! Hello, Python!'
print(var.replace('Hello', 'Buy', 2).center(60).swapcase())
# Вывод:

              bUY, c! bUY, js! hELLO, pYTHON!               

zfill()  возвращает копию строки дополненную нулями слева для достижения длины строки указанной в параметре width:

var = 12/100*(-0.5)

print(str(var).zfill(7))
# Вывод:

-000.06

Если строка короче или равна параметру width, строка возвращается без изменений:

var = 10/3
print(str(var).zfill(7))
# Вывод:

3.3333333333333335

Методы преобразования строки в список

Методы в данной группе превращают строку в другой тип данных и наоборот. Эти методы возвращают или принимают коллекции (чаще всего это список).

join() возвращает строку, которая является результатом конкатенации элементов коллекции и разделителя.

var: list[str] = ['1', '2', '3']
print('+'.join(var))
var: tuple[str, str, str] = ('1', '2', '3')
print(' & '.join(var))
var: set[str, str, str] = {'1', '2', '3'}
print(' и '.join(var))
var: dict[str, int] = {'1': 4, '2': 5, '3': 6}
print('->'.join(var))
# Вывод:

1+2+3

1 & 2 & 3

3 и 2 и 1

1->2->3

Стоит обратить внимание что все элементы итерируемого объекта должны быть строкового типа. Так же Вы могли заметить в последнем примере, что для объединения словаря в строку метод join() использует не значения, а ключи. Если Вам нужны именно ключи, то делается это так:

var: dict[str, str] = {'1': '4', '2': '5', '3': '6'}
print('->'.join(var.values()))
# Вывод:

4->5->6

Сложнее ситуация, когда нужны пары ключ-значение. Здесь придётся сперва распаковать кортежи.

var: dict[str, str] = {'1': '4', '2': '5', '3': '6'}
print('->'.join([str(a+':'+b) for a, b in var.items()]))
# Вывод:

1:4->2:5->3:6

partition() делит строку на основе разделителя (действие, обратное join). Возвращаемое значение представляет собой кортеж из трех частей:

  • Часть строки до разделителя
  • Разделитель
  • Часть строки после разделителя

print('1:4->2:5->3:6'.partition(':'))
# Вывод:

('1', ':', '4->2:5->3:6')

Если разделитель не найден, возвращаемый кортеж содержит строку и ещё две пустые строки:

print('1:4->2:5->3:6'.partition('7'))
# Вывод:

('1:4->2:5->3:6', '', '')

rpartition() делит строку на основе разделителя, начиная с конца.

rsplit() делит строку на список из подстрок. По умолчанию разделителем является пробел.

print('1:4->2:5->3:6'.rsplit('->'))
# Вывод:

['1:4', '2:5', '3:6']

split() делит строку на список из подстрок.

Ведет себя как rsplit(), за исключением того, что при указании maxsplit – максимального количества разбиений, деление начинается с левого края строки:

print('1:4->2:5->3:6'.rsplit('->', 1))
print('1:4->2:5->3:6'.split('->', 1))
# Вывод:

['1:4->2:5', '3:6']

['1:4', '2:5->3:6']

Если параметр maxsplit не указан, между rsplit() и split() разницы нет.

splitlines() делит текст на список строк и возвращает их в списке. Любой из следующих символов или последовательностей символов считается границей строки:

Разделитель Значение
\n Новая строка
\r Возврат каретки
\r\n Возврат каретки + перевод строки
\v или же \x0b Таблицы строк
\f или же \x0c Подача формы
\x1c Разделитель файлов
\x1d Разделитель групп
\x1e Разделитель записей
\x85 Следующая строка
\u2028 Новая строка (Unicode)
\u2029 Новый абзац (Unicode)

Заключение

В этом уроке мы рассмотрели основные инструменты для работы со строками в Python. Как видите, они удобны и гибки. Есть встроенные функции и методы объекта «строка», строковые литералы. Ещё больше возможностей даёт нерассмотренный в этом уроке метод format и модуль re. Так же отдельного разговора заслуживает работа с кодировками. Следует отметить для тех, кто уже знаком с другими языками программирования: в отличие от некоторых из них, один символ в Пайтоне тоже является строкой. И изюминка напоследок. Поскольку в Питоне всё является объектом, у каждой строки тоже есть атрибуты.

from pprint import pprint

pprint('Строка'.__dir__())
# Вывод:

['__repr__',

'__hash__',

'__str__',

'__getattribute__',

'__lt__',

'__le__',

'__eq__',

'__ne__',

'__gt__',

'__ge__',

'__iter__',

'__mod__',

'__rmod__',

'__len__',

'__getitem__',

'__add__',

'__mul__',

'__rmul__',

'__contains__',

'__new__',

'encode',

'replace',

'split',

'rsplit',

'join',

'capitalize',

'casefold',

'title',

'center',

'count',

'expandtabs',

'find',

'partition',

'index',

'ljust',

'lower',

'lstrip',

'rfind',

'rindex',

'rjust',

'rstrip',

'rpartition',

'splitlines',

'strip',

'swapcase',

'translate',

'upper',

'startswith',

'endswith',

'removeprefix',

'removesuffix',

'isascii',

'islower',

'isupper',

'istitle',

'isspace',

'isdecimal',

'isdigit',

'isnumeric',

'isalpha',

'isalnum',

'isidentifier',

'isprintable',

'zfill',

'format',

'format_map',

'__format__',

'maketrans',

'__sizeof__',

'__getnewargs__',

'__doc__',

'__setattr__',

'__delattr__',

'__init__',

'__reduce_ex__',

'__reduce__',

'__subclasshook__',

'__init_subclass__',

'__dir__',

'__class__']

Оцените статью
О Python на русском языке
Добавить комментарий

Adblock
detector