§11. Строки

Строковый тип

Строка (символьная строка) – это последовательность символов с произвольным доступом. Строки в Python представлены типом str, который хранит последовательность символов Unicode. Строковый тип str – представляет собой неизменяемый тип. Это означает, что попытка изменить символ в строке следующей инструкцией вызовет ошибку:

my_str[1] = 'R' 

Строка считывается со стандартного ввода функцией input().
Напомним, что строковые литералы можно заключать в одинарные, двойные или тройные кавычки (''' или """). При этом вид кавычек в начале и в конце должен совпадать. Кавычки одного типа могут быть произвольно вложены в кавычки другого типа. Если внутри кавычек одного типа используются кавычки того же типа, то они должны быть экранированы символом \. Если строка заключается в тройные кавычки, то внутри можно произвольно использовать двойные кавычки или апострофы, но не тройные. В тройные кавычки заключаются большие блоки текста. Для предотвращения перевода на новую строку, необходимо экранировать символ перевода на новую строку с помощью символа \. Например:

S = """Это большой блок текста
в котором можно использовать
перевод на новую строку, а также
одинарные '' (апострофы) или "" кавычки.
Допускается экранирование символа
перевода на новую строку \
как продемонстрировано здесь."""
print(S)
Это большой блок текста
в котором можно использовать
перевод на новую строку, а также
одинарные '' (апострофы) или "" кавычки.
Допускается экранирование символа
перевода на новую строку как продемонстрировано здесь.

Программа 11.1

from sys import getsizeof
S = ("Длинные строки можно"
    " оформить и таким образом")    
print(S)
S = "Это правильное 'использование' литерала"
print(S)
#S = 'А здесь ошибка - ' неэкранированный апостроф'
S = 'Правильно будет так:\nА здесь ошибка - \' неэкранированный апостроф'
print(S)
print('Сравнение размера (в байтах) строк одинаковой длины:\n'
      'юникод-строки и байт-строки')
S = 'йцукенгшщзхъ'
print(S, '->', getsizeof(S))
S = b'qwertyuiop[]'
print(S, '->', getsizeof(S))
Длинные строки можно оформить и таким образом
Это правильное 'использование' литерала
Правильно будет так:
А здесь ошибка - ' неэкранированный апостроф
Сравнение размера (в байтах) строк одинаковой длины:
юникод-строки и байт-строки
йцукенгшщзхъ -> 62
b'qwertyuiop[]' -> 29

Примечание. Использование byte-литерала позволяет сократить размер строки в байтах, если в строке используются только символы ASCII

Базовые операции

К строкам можно применять операции среза, но с помощью срезов строку изменять нельзя! Хотя саму строку изменять мы не можем, но используя, уже известную нам, операцию конкатенации + (“соединения”) и срезы можно получить новую строку, на основе имеющейся. Следующий пример демонстрирует это:

S = "Размером планеты можно пренебречь"
S = S[:17] + "нельзя" + S[22:] + "!"
print(S)
Размером планеты нельзя пренебречь!

С помощью инструкции “*” строку можно умножать (дублировать):

S = "#"
S = S * 25
print(S)
#########################

Также к строкам можно применять следующие операции:

  • += – добавление в конец,
  • *= – присваивание с дублированием,
  • in, not in – проверка на вхождение:
if "а" in "Строка":
	print("Этот символ есть в строке")

Строки можно сравнивать с помощью операций <, <=, ==, !=, >, >=

print("Москва" > "Питера")
print("Moon" < "Sun")
False
True

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

Константы модуля string

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

import string
print(string.ascii_letters)
print(string.ascii_lowercase)
print(string.ascii_uppercase)
print(string.digits)
print(string.hexdigits)
print(string.octdigits)
print(string.punctuation)
print(string.printable)
print(string.whitespace)
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
0123456789abcdefABCDEF
01234567
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 

Напомним, для того, чтобы создать литерал, содержащий только символы ASCII, необходимо использовать префикс b (или B, Byte-литерал):

B"Это строка ASCII-символов"

Списки и строки

Строки можно преобразовать в списки и наоборот. В данной программе список В содержит список слов исходной строки A, полученный с помощью метода split(). Элементами списка C являются символы строки A. Для того, чтобы список символов вновь стал строкой (D) необходимо применить метод join() (обратный методу split()). Подробнее о методах см. ниже.

A = "Это строка символов"
B = A.split(' ')
C = list(A)
D = ''.join(C)
print(A)
print(B)
print(C)
print(D)
Это строка символов
['Это', 'строка', 'символов']
['Э', 'т', 'о', ' ', 'с', 'т', 'р', 'о', 'к', 'а', ' ', 'с', 'и', 'м', 'в', 'о', 'л', 'о', 'в']
Это строка символов

Преобразования

  • str() может вызываться как функция создания строковых объектов. Если она вызывается без аргументов, то возвращается пустая строка. Если аргумент не является строкой, то возвращается его строковое представление. Если аргумент
    является строкой, возвращается копия строки.
Для обратного преобразования используются следующие функции:

  • int(S[, base]) – конвертирует строку S в целое число по основанию base (по умолчанию 10, может принимать значения от 10 до 35);
  • float(S) – конвертирует строку S в действительное число.
Как уже сказано, в python отсутствует символьный тип. Если строка состоит из одного символа, то можно воспользоваться следующими функциями преобразования код <-> символ:

  • ord() – возвращает значение байта;
  • chr() – возвращает символ по его коду.
Эти функции позволяют решать задачи с посимвольным выводом кодовой таблицы. Например, можно вывести часть кодовой таблицы UTF-8, занимаемой кириллицей (первые 110 символов) в виде матрицы 11х10.
Программа 11.2

i = 1
while i < 111:
	print(chr(ord("А") + i - 1), "", end="")
	if i % 10 == 0:
		print()
	i += 1
А Б В Г Д Е Ж З И Й 
К Л М Н О П Р С Т У 
Ф Х Ц Ч Ш Щ Ъ Ы Ь Э 
Ю Я а б в г д е ж з 
и й к л м н о п р с 
т у ф х ц ч ш щ ъ ы 
ь э ю я ѐ ё ђ ѓ є ѕ 
і ї ј љ њ ћ ќ ѝ ў џ 
Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ 
Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ 
Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ 

Как видите, символы представлены не только современным алфавитом, но и историческими буквами. Хотя код символа заглавной буквы "А" известен (1040), используя такой подход в решении задачи, об этом можно не задумываться.

Методы

Для работы со строкой используется обольшое количество методов. Ниже приведены наиболее востребованные. Полный список методов можно получить в документации на сайте Python. Поскольку строка, как мы уже сказали, неизменяемый объект, при вызове методов это обстоятельство следует учитывать (т. е. создается новая строка).

Функции и методы строк
Метод или функция Описание
len(S) Длина строки
S.find(S1[, start[, end]]) Поиск подстроки S1 в строке S. Возвращает позицию первого вхождения или -1
S.replace(S1, S2[, count]) Заменяет подстроку S1 подстрокой S2 не больше, чем первые count
S.split(char) Получение списка по разделителю char
S.splitlines() Получение списка строк разбитых символом разрыва строки (не включается в результирующий список)
S.isdigit() Состоит ли строка из цифр
S.isalpha() Состоит ли строка из букв
S.isalnum() Состоит ли строка из цифр или букв
S.islower() Состоит ли строка из символов в нижнем регистре
S.isupper() Состоит ли строка из символов в верхнем регистре
S.isspace() Состоит ли строка из пробельных символов
S.upper() Преобразование строки к верхнему регистру
S.lower() Преобразование строки к нижнему регистру
S.join(list) Сборка строки из списка с разделителем S
S.center(width[, fill]) Возвращает отцентрованную строку, по краям которой стоит символ fill (пробел по умолчанию)
S.count(S1[, start[, end]]) Возвращает количество непересекающихся вхождений подстроки S1
S.strip() Удаление пробельных символов в начале и в конце строки
S.format(*args, **kwargs) Форматирование строки

Например.
Программа 11.3

S = "q-q-q-q-q-q-q-q-q-q-q"
print(S)
S = S.replace("-", "#")
print(S)
if S.islower():
	S = S.upper()
print(S)
q-q-q-q-q-q-q-q-q-q-q
q#q#q#q#q#q#q#q#q#q#q
Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q
Print Friendly, PDF & Email

Comments are closed