str Python

Содержание
Введение
Пример
Multiline Strings
Универсальный перенос строки
Экранирование символов (Escape Characters)
Raw Strings
str(): изменить тип на str
Доступ к символам строки
Методы
Обрезать строку
index(): порядковый номер элемента
Unicode
string Module
bytes
split(): строку в список
strip(): очистить от лишних символов
replace(): замена символов
Похожие статьи

Введение

Объект типа str содержит в себе поседовательность Unicode символов (Unicode code points)

Это неизменяемый (Immutable) объект. Про разницу между изменяемыми и неизменяемыми объектами читайте здесь и здесь

О том, как правильно переносить слишком длинные строки читайте здесь

Пример

>>> 'HeiHei.ru'
>>> "TopBicycle.ru"

Можно использовть как одинарные так и двойные кавычки. Если начали с одинарной то и закончить нужно одинарной - нельзя смешивать

>>> "eth1.ru'

File "<stdin>", line 1 "eth1.ru' ^ SyntaxError: EOL while scanning string literal

>>> 'eth1.ru"

File "<stdin>", line 1 'eth1.ru" ^ SyntaxError: EOL while scanning string literal

Один тип кавычек можно вложить в другой

>>> "Andrei's site eth1.ru"

"Andrei's site eth1.ru"

Multiline Strings

Многострочные переменные часто удобны для лучшей читаемости кода. Если вы вводите какое-то длинное значени

Их можно создать, заключив значение между """ и """ (или между ''' и ''')

Смотрите также docsting

>>> """Это пример ...многострочной ...переменной типа ..str"""

'Это пример\nмногострочной\nпеременной типа\nstr'

Каждый перенос строки представлен символом \n. Я выделил его жёлтым для наглядности. Для Python это такой же символ как и остальные просто созданный с помощью экранирования , о котором мы поговорим чуть ниже.

Зададим переменной s значение с использованием \n

>>> s = 'Это пример\nмногострочной\nпеременной типа\nstr' >>> print(s)

Это пример многострочной переменной типа str

Точно такой же результат можно получить используя """ """

>>> s = """Это пример ... многострочной ... переменной типа ... str""" >>> print(s)

Это пример многострочной переменной типа str

Универсальный перенос строки

С помощью встроенного в Python Universal Newlines \n переводится в ту последовательность символов, которая принята в вашей операционной системе.

В Windows переход на новую строку (Carriage-return) это \r\n

В Linux, MacOS и других UNIX это \r

Работая с Python не нужно задумываться выборе символов для переноса строки - достаточно везде писать \n.

Подробности можно изучить в PEP 278 -- Universal Newline Support

\ означает начало экранированной последовательности (Escape Sequence).

Также рекомендую к прочтению статью

«Перенос слишком длинной строки на новую»

Escape Sequences

Экранированный символ теряет своё изначальное значение и воспринимается интерпретатором как обычный символ либо наоборот приобретает дополнительный смысл как мы уже видели на примере \n

Сравните

>>> "This is n it is a normal symbol"

'This is n it is a normal symbol'

>>> s = "This is n it is a normal symbol"
>>> print(s)

This is n it is a normal symbol

И

>>> "This is \n it is an escaped symbol"

'This is \n it is an escaped symbol'

>>> s = "This is \n it is an escaped symbol"
>>> print(s)

This is it is an escaped symbol

Вместо n теперь перенос строки

Экранирование можно применить для использования одинаковых кавычек внутри и снаружи строки

>>> "Двойная кавычка \" внутри двойных"

'Двойная кавычка " внутри двойных'

>>> 'Одинарная кавычка \' внутри одинарных'

'Одинарная кавычка ' внутри одинарных'

Если экранирование не подразумевается, то \ будет всё равно будет воспринят интерпретатором как попытка экранирования и не появится как обычный символ

>>> 'Двойную кавычку \" можно не экранировать внутри одинарных а \' одинарную нужно'

'Двойную кавычку " можно не экранировать внутри одинарных а \' одинарную нужно'

>>> s = 'Двойную кавычку \" можно не экранировать внутри одинарных а \' одинарную нужно'

>>> print(s)

Двойную кавычку " можно не экранировать внутри одинарных а ' одинарную нужно

Чтобы всё-таки увидеть \ нужно написать \\ то есть проэкранировать символ экранирования

>>> s = '\\'

>>> print(s)

\

Все Escape Sequences в Python
Escape Sequence Значение Примечания
\newline Backslash and newline ignored
\\ Backslash (\)
\' Single quote (')
\" Double quote (")
\a ASCII Bell (BEL)
\b ASCII Backspace (BS)
\f ASCII Formfeed (FF)
\n ASCII Linefeed (LF)
\r ASCII Carriage Return (CR)
\t ASCII Horizontal Tab (TAB)
\v ASCII Vertical Tab (VT)
\ooo Character with octal value ooo (1,3)
\xhh Character with hex value hh (2,3)
Escape Sequences которые распознаются только внутри сторокового литерала
Escape Sequence Значение Примечания
\N{name} Character named name in the Unicode database (4)
\uxxxx Character with 16-bit hex value xxxx (5)
\Uxxxxxxxx Character with 32-bit hex value xxxxxxxx (6)
docs.python.org/3/reference/lexical_analysis.html

Примечания:

As in Standard C, up to three octal digits are accepted.

Unlike in Standard C, exactly two hex digits are required.

In a bytes literal, hexadecimal and octal escapes denote the byte with the given value. In a string literal, these escapes denote a Unicode character with the given value.

Changed in version 3.3: Support for name aliases 1 has been added.

Exactly four hex digits are required.

Any Unicode character can be encoded this way. Exactly eight hex digits are required.

Raw Strings

В случаях когда нужно использовать много символов нуждающихся в экранировании пригодятся raw strings

Они позволяют вводить данные практически в WYSIWYG виде.

Например, удобно использовать raw string для храния адреса системного пути в Windows

>>> path = r'C:\Users\Andrei\Sites\HeiHeiRu'
>>> path

'C:\\Users\\Andrei\\Sites\\HeiHeiRu'

>>> print(path)

C:\Users\Andrei\Sites\HeiHeiRu

Изменить тип на str

Превратить что-то другое в строку можно с помощью функции str()

Допустим, нужно объединить числовое значение и строку. Хотя у Python динамическая типизация, он не будет в этом случае додумывать за вас и выдаст TypeError

pi = 3.1415 text = "Pi is approximately " + pi

python str_ex.py

Traceback (most recent call last): File "str_ex.py", line 3, in <module> text = "Pi is approximately " + pi TypeError: can only concatenate str (not "float") to str

Если применить str() к переменной pi ошибка будет исправлена

pi = 3.1415 text = "Pi is approximately " + str(pi) print(text)

python str_ex.py

Pi is approximately 3.1415

Примеры в интерактивном режиме

>>> str(123)

'123'

>>> str(6.626e-34)

'6.626e-34'

Доступ к символам строки

Если нужно воспользоваться не всем объектом типа str а только каким-то символом, это лего сделать указав его порядковый номер в квадратных скобках.

>>> s = "heihei.ru"
>>> s[0]

'h'

>>> s[1]

'e'

Какой индекс нужно указать, чтоб получить точку?

Проверить тип переменной можно с помощью функции type()

>>> type(s)

<class 'str' >

У символа входящего в состав строки тип, естественно, тоже str

>>> type(s[2])

<class 'str' >

Методы (capitalize)

Изучить все доступные для работы со str методы можно вызвав функцию help с аргументом str

>>> help(str)

Рассмотрим метод capitalize

| capitalize(self, /) | Return a capitalized version of the string. | | More specifically, make the first character have upper case and the rest lower | case.

>>> c = "topBicycle.ru"
>>> c.capitalize()

'Topbicycle.ru'

Первая буква стала заглавной. Все остальные стали строчными.

capitalize() не изменят изначальную строку. Это можно проверить выполнив

>>> c

'topBicycle.ru'

Обрезать строку

# удалить x символов с конца строки s s[:-x] # удалить y символов с начала строки s s[y:] # обрезать и начало и конец s[y:-x] # оставить только x символов с начала строки s s[:x] # оставить только y символов с конца строки s s[-y:]

Как запомнить что будет удалено:

Число это всегда индекс элемента. Он может быть как положительным так и отрицательным. 0 и -0 это одно и то же.

Если число стоит справа от двоеточия - удалится то что справа от индекса включая элемент с этим индексом.

Если число стоит слева от двоеточия - удалится то что слева от индекса.

s = s[x:] + s[:x]

Пример

# 012345678 url = "https://www.heihei.ru" print(url[:8]) # https:// print(url[8:]) # www.heihei.ru

https:// www.heihei.ru

url = "https://www.heihei.ru" print(url[:-3]) # https://www.heihei print(url[-3:]) # .ru

https://www.heihei .ru

index(): порядковый номер элемента

index() возвращает порядковый номер первого элемента совпадающего с заданным.

index(value, start, end)

start можно не указывать - по умолчанию поиск идёт с начала строки

end можно не указывать - по умолчанию поиск идёт до конца строки

Возвращается индекс только первых a, b и c

str1 = "abcabcabc" print(str1.index("a")) # 0 print(str1.index("b")) # 1 print(str1.index("c")) # 2 str2 = 'a"bc""' print(str2.index('"')) # 1

Если нужно найти не первое совпадение - можно задать start

str3 = 'a"bc"def"' print(str3.index('"')) # 1 print(str3.index('"', 0)) # 1 print(str3.index('"', 1)) # 1 print(str3.index('"', 2)) # 4 print(str3.index('"', 3)) # 4 print(str3.index('"', 4)) # 4 print(str3.index('"', 5)) # 8

Если начать поиск со втрого элемента, следующим совпадением будет элемент с индеком 4. Если с пятого, то 8.

Чтобы задать точные границы поиска нужны и start и end

print(str3.index('"', 2, 6)) # 4 # print(str3.index('"', 5, 7)) # ValueError

Если в этом диапазоне нет совпадений - вернётся ValueError

Unicode

Python поддерживает Unicode так как по дефолту в нём используется UTF-8

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

>>> "Pythonia voi käyttää myös vaativassa ja tieteellisessä"

'Pythonia voi käyttää myös vaativassa ja tieteellisessä'

Если бы поддержки не было скорее всего пришлось бы заменять специальные символы, такие как умлауты, на из юникод представление

>>> "Pythonia voi k\u00e4ytt\u00e4\u00e4 my\u00f6s vaativassa ja tieteellisess\u00e4"

'Pythonia voi käyttää myös vaativassa ja tieteellisessä'

Можно получить юникод символы и другими способами

'\xe4'

'ä'

string Module

Подключив библиотеку string можно пользоваться готовыми наборами символов

whitespace = ' \t\n\r\v\f'
ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_letters = ascii_lowercase + ascii_uppercase
digits = '0123456789'
hexdigits = digits + 'abcdef' + 'ABCDEF'
octdigits = '01234567'
punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
printable = digits + ascii_letters + punctuation + whitespace

bytes

>>> s = 'abc'
>>> bytes(s, 'utf-8')

b'abc'

>>> s = 'абв'
>>> bytes(s, 'utf-8')

b'\xd0\xb0\xd0\xb1\xd0\xb2'

а - \xd0\xb0
б - \xd0\xb1
в - \xd0\xb2

>>> s = 'ä'
>>> bytes(s, 'utf-8')

b'\xc3\xa4'

ä - \xc3\xa4

>>> s = 'абв'
>>> b = bytes(s, 'utf-8')
print(b)

b'\xd0\xb0\xd0\xb1\xd0\xb2'

>>> str(b)

Получится не совсем то, что нужно

"b'\xd0\xb0\xd0\xb1\xd0\xb2'"

А вот если добавить правильную кодировку, то абв снова появятся

>>> str(b, 'utf-8')

'абв'

Указав неправильную кодировку можно получить какой-то неправильный результат

>>> str(b, 'cp1251')

'абв'

Указав опцию b можно посмотреть содержимое файла, например изображения

>>> file = "/home/andrei/image.png"
>>> f = open(file, 'rb')
>>> f.read()

b'\x89PNG\r\n…

Подробнее в статье «Работа с файлами в Python»

split(): строку в список

Превратить строку в список можно методом split()

По умолчанию разделитель это пробел

>>> cities = "Benalmadena Cordoba Fuengirola Malaga Narva Riga" >>> c_list = cities.split() >>> c_list[3]

'Malaga'

Если бы разделителем был не пробел а другой символ, например |, и он встречался бы в начале и конце строки в списке появились бы две дополнительных пустых строки.

cities = "|Benalmadena|Cordoba|Fuengirola|Malaga|Narva|Riga|" c_list = cities.split("|") print(c_list)

['', 'Benalmadena', 'Cordoba', 'Fuengirola', 'Malaga', 'Narva', 'Riga', '']

Избавиться от ненужных пустых строк можно с помощью функций filter() и list()

print(list(filter(None, c_list)))

['Benalmadena', 'Cordoba', 'Fuengirola', 'Malaga', 'Narva', 'Riga']

strip(): очистить от лишних символов

Убрать из строки лишние символы в начале и конце строки можно методом strip()

По умолчанию удаляются пробелы

site = " heihei.ru " s = site.strip() print("of all websites", s, "is my favorite")

of all websites heihei.ru is my favorite

Можно явно указать от каких символов нужно очистить строку.

capital = ",,,bbbbbcc....Riga..,,zz" c = capital.strip(",bc.z") print(c, "is the captital of Latvia")

Riga is the captital of Latvia

strip() удаляет символы только в самом начале и в самом конце строки

a = "----A---B---C----" print(a) b = a.strip("-") print(b)

----A---B---C---- A---B---C

Если нужна замена символов во всей строке - подойдёт метод replace()

replace()

С помощью replace() можно заменить символы на другие где бы они не находились.

Рассмотрим пример с uuid() - удалим все дефисы.

uid = str(uuid.uuid4()) rp = uid.replace("-", "") print(rp)

ceff8b0e-408f-489a-8441-52e95952ff04 ceff8b0e408f489a844152e95952ff04

isalpha()

Функция isalpha() возвращает True если ве символы это буквы.

>>> s = "ABC" >>> s.isalpha() True >>> s = "AbC" >>> s.isalpha() True >>> s = "Ab1" >>> s.isalpha() False

isupper()

Функция isupper() возвращает True если ве символы это буквы в верхнем регистре.

>>> s = "ABC" >>> s.isupper() True >>> s = "AbC" >>> s.isupper() False

Нужно иметь виду, что если в строке только числа isupper() вернёт False

>>> s = "123" >>> s.isupper() False

Но если числа идут вперемешку с буквами в верхнем регистре isupper() вернёт True

>>> s = "AB1" >>> s.isupper() True

Вопросы для самопроверки

1

Вопрос: что вернёт print(res)

# 1 str3 = 'a"bc"def"' res = str3[str3.index('"')+1:str3.index('"', (str3.index('"')+1))]

Посмотреть ответ

2

Вопрос: что вернёт s.isupper()

s = "1C"

Посмотреть ответ

Ответы

Вопрос 1

# 1 res = str3[str3.index('"')+1:str3.index('"', (str3.index('"')+1))] print(res) # bc

bc

Вопрос 2

# 2 s = "1C" print(s.isupper())

True

Похожие статьи
Built-in Collections
Строки
f-string
format string
Списки []
list comprehension: Абстракция списка
Словари {:}
dict comprehension: Абстракция словаря
Множества {}
set comprehension: Абстракция множества
Кортежи ()
Протоколы
Итерация
Python
if, elif, else
Циклы
Перенос слишком длинной строки на новую

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: