Введение
В этом разделе рассказывается о способах работы с текстом.
This tutorial is from open-source community. Access the source code
В этом разделе рассказывается о способах работы с текстом.
Строковые литералы записываются в программах в кавычках.
## одинарные кавычки
a = 'Yeah but no but yeah but...'
## двойные кавычки
b = "computer says no"
## тройные кавычки
c = '''
Look into my eyes, look into my eyes, the eyes, the eyes, the eyes,
not around the eyes,
don't look around the eyes,
look into my eyes, you're under.
'''
обычно строки могут занимать только одну строку. Тройные кавычки захватывают весь текст, заключенный на нескольких строках, включая весь форматирование.
Нет разницы между использованием одинарных (') и двойных (") кавычек. Однако для открытия и закрытия строки должны использоваться одинаковые кавычки.
Символы-экранирование используются для представления управляющих символов и символов, которые не могут быть легко введены непосредственно с клавиатуры. Вот некоторые общие символы-экранирование:
'\n' Перевод строки
'\r' Возврат каретки
'\t' Табуляция
'\'' Литеральная одинарная кавычка
'\"' Литеральная двойная кавычка
'\\' Литеральный обратный слеш
Каждый символ в строке хранится внутри программы в виде так называемой "кодовой точки" Unicode, которая представляет собой целое число. Вы можете указать точное значение кодовой точки с помощью следующих последовательностей экранирования:
a = '\xf1' ## a = 'ñ'
b = '\u2200' ## b = '∀'
c = '\U0001D122' ## c = '𝄢'
d = '\N{FOR ALL}' ## d = '∀'
Unicode Character Database является справочным ресурсом по всем доступным кодам символов.
Строки работают подобно массивам для доступа к отдельным символам. Для этого используется целое число - индекс, начиная с 0. Отрицательные индексы задают позицию относительно конца строки.
a = 'Hello world'
b = a[0] ## 'H'
c = a[4] ## 'o'
d = a[-1] ## 'd' (конец строки)
Можно также извлекать срезы или подстроки, указывая диапазон индексов с помощью двоеточия :.
d = a[:5] ## 'Hello'
e = a[6:] ## 'world'
f = a[3:8] ## 'lo wo'
g = a[-5:] ## 'world'
Символ с индексом, равным конечному значению диапазона, не включается. Если индекс отсутствует, считается, что подразумевается начало или конец строки.
Конкатенация, длина, принадлежность и повторение.
## Конкатенация (+)
a = 'Hello' + 'World' ## 'HelloWorld'
b = 'Say'+ a ## 'Say HelloWorld'
## Длина (len)
s = 'Hello'
len(s) ## 5
## Проверка принадлежности (`in`, `not in`)
t = 'e' in s ## True
f = 'x' in s ## False
g = 'hi' not in s ## True
## Повторение (s * n)
rep = s * 5 ## 'HelloHelloHelloHelloHello'
Строки имеют методы, которые выполняют различные операции с данными строк.
Пример: удаление любых начальных/концевых пробелов.
s =' Hello '
t = s.strip() ## 'Hello'
Пример: преобразование регистра.
s = 'Hello'
l = s.lower() ## 'hello'
u = s.upper() ## 'HELLO'
Пример: замена текста.
s = 'Hello world'
t = s.replace('Hello', 'Hallo') ## 'Hallo world'
Другие методы строк:
Строки имеют огромное количество других методов для проверки и манипулирования данными текста. Вот небольшой пример методов:
s.endswith(suffix) ## Проверить, заканчивается ли строка на suffix
s.find(t) ## Первое вхождение t в s
s.index(t) ## Первое вхождение t в s
s.isalpha() ## Проверить, являются ли символы буквенными
s.isdigit() ## Проверить, являются ли символы цифровыми
s.islower() ## Проверить, являются ли символы строчными
s.isupper() ## Проверить, являются ли символы прописными
s.join(slist) ## Объединить список строк, используя s в качестве разделителя
s.lower() ## Преобразовать в нижний регистр
s.replace(old,new) ## Заменить текст
s.rfind(t) ## Найти t с конца строки
s.rindex(t) ## Найти t с конца строки
s.split([delim]) ## Разбить строку на список подстрок
s.startswith(prefix) ## Проверить, начинается ли строка с prefix
s.strip() ## Удалить начальные/концевые пробелы
s.upper() ## Преобразовать в верхний регистр
Строки являются "неизменяемыми" или только для чтения. Как только они созданы, их значение нельзя изменить.
>>> s = 'Hello World'
>>> s[1] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError:'str' object does not support item assignment
>>>
Все операции и методы, которые манипулируют данными строк, всегда создают новые строки.
Используйте str(), чтобы преобразовать любое значение в строку. Результат — это строка, содержащая тот же текст, который был бы выведен с помощью инструкции print().
>>> x = 42
>>> str(x)
'42'
>>>
Последовательность 8-битных байт, которая часто встречается при работе с низкоуровневым вводом-выводом, записывается следующим образом:
data = b'Hello World\r\n'
Поставив маленькую b перед первой кавычкой, вы указываете, что это байтовая строка, в отличие от текстовой.
Большинство обычных операций со строками работают.
len(data) ## 13
data[0:5] ## b'Hello'
data.replace(b'Hello', b'Cruel') ## b'Cruel World\r\n'
Индексирование немного отличается, потому что возвращает значения байтов в виде целых чисел.
data[0] ## 72 (ASCII-код для 'H')
Преобразование в текстовые строки и обратно.
text = data.decode('utf-8') ## байты -> текст
data = text.encode('utf-8') ## текст -> байты
Аргумент 'utf-8' задает кодировку символов. Другие распространенные значения включают 'ascii' и 'latin1'.
сырые строки - это литералы строк с необработанным обратным слэшем. Они задаются с использованием префикса в виде маленькой "r" перед начальной кавычкой.
>>> rs = r'c:\newdata\test' ## Raw (uninterpreted backslash)
>>> rs
'c:\\newdata\\test'
Строка представляет собой точный текст, заключенный внутри кавычек, именно так, как он был введен. Это полезно в ситуациях, когда обратный слэш имеет особое значение. Например: имя файла, регулярные выражения и т.д.
Строка с подстановкой форматированных выражений.
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> a = f'{name:>10s} {shares:10d} {price:10.2f}'
>>> a
' IBM 100 91.10'
>>> b = f'Cost = ${shares*price:0.2f}'
>>> b
'Cost = $9110.00'
>>>
Примечание: это требует Python 3.6 или более поздней версии. Значение форматных кодов описывается позже.
В этих упражнениях вы будете экспериментировать с операциями над типом строк в Python. Вы должны делать это в интерактивном режиме Python, где можно легко увидеть результаты. Важное примечание:
В упражнениях, где вы должны взаимодействовать с интерпретатором,
>>>- это приглашение интерпретатора, которое вы получаете, когда Python ожидает, чтобы вы ввели новую инструкцию. Некоторые инструкции в упражнении занимают несколько строк - чтобы выполнить эти инструкции, вы, возможно, придется нажать 'Enter' несколько раз. Просто напомним, что вы НЕ вводите>>>при выполнении этих примеров.
Начните с определения строки, содержащей серию символов тикеров акций, как это:
>>> symbols = 'AAPL,IBM,MSFT,YHOO,SCO'
>>>
Строки - это массивы символов. Попробуйте извлечь несколько символов:
>>> symbols[0]
?
>>> symbols[1]
?
>>> symbols[2]
?
>>> symbols[-1] ## Последний символ
?
>>> symbols[-2] ## Отрицательные индексы отсчитываются от конца строки
?
>>>
В Python строки являются неизменяемыми (read-only).
Проверьте это, попробовав изменить первый символ symbols на строчную 'a'.
>>> symbols[0] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>
Хотя данные строки являются неизменяемыми (read-only), вы всегда можете переприсвоить переменную новой созданной строке.
Попробуйте следующую инструкцию, которая конкатенирует новый символ "GOOG" в конец symbols:
>>> symbols = symbols + 'GOOG'
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCOGOOG'
>>>
Упс! Это не то, что вы хотели. Исправьте это так, чтобы переменная symbols содержала значение 'AAPL,IBM,MSFT,YHOO,SCO,GOOG'.
>>> symbols =?
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>
Добавьте 'HPQ' в начало строки:
>>> symbols =?
>>> symbols
'HPQ,AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>
В этих примерах может показаться, что исходная строка изменяется, на первый взгляд нарушая неизменяемость строк. Не так. Операции над строками создают совершенно новую строку каждый раз. Когда переменная symbols переприсваивается, она указывает на новую созданную строку. Затем старая строка уничтожается, так как она больше не используется.
Попробуйте оператор in для проверки наличия подстрок. В интерактивном режиме выполните следующие операции:
>>> 'IBM' in symbols
?
>>> 'AA' in symbols
True
>>> 'CAT' in symbols
?
>>>
Почему проверка на 'AA' вернула True?
В интерактивном режиме Python попробуйте экспериментировать с некоторыми методами строк.
>>> symbols.lower()
?
>>> symbols
?
>>>
Помните, строки всегда являются неизменяемыми (read-only). Если вы хотите сохранить результат операции, вам нужно поместить его в переменную:
>>> lowersyms = symbols.lower()
>>>
Попробуйте еще несколько операций:
>>> symbols.find('MSFT')
?
>>> symbols[13:17]
?
>>> symbols = symbols.replace('SCO','DOA')
>>> symbols
?
>>> name = ' IBM \n'
>>> name = name.strip() ## Удалить окружающий пробел
>>> name
?
>>>
Иногда вы хотите создать строку и вставить в нее значения переменных.
Для этого используйте f-строку. Например:
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{shares} shares of {name} at ${price:0.2f}'
'100 shares of IBM at $91.10'
>>>
Измените программу mortgage.py из упражнения 1.10, чтобы она использовала f-строки для создания вывода. Постарайтесь сделать так, чтобы вывод был хорошо выровнен.
Одна из ограниченностей базовых операций со строками заключается в том, что они не поддерживают никакого вида продвинутого сопоставления шаблонов. Для этого вам нужно обратиться к модулю re в Python и регулярным выражениям. Работа с регулярными выражениями - большая тема, но вот простой пример:
>>> text = 'Today is 3/27/2018. Tomorrow is 3/28/2018.'
>>> ## Найти все вхождения даты
>>> import re
>>> re.findall(r'\d+/\d+/\d+', text)
['3/27/2018', '3/28/2018']
>>> ## Заменить все вхождения даты на текст замены
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
'Today is 2018-3-27. Tomorrow is 2018-3-28.'
>>>
Для получения дополнительной информации о модуле re обратитесь к официальной документации по адресу https://docs.python.org/library/re.html.
Когда вы начинаете экспериментировать с интерпретатором, часто хочется узнать больше о операциях, поддерживаемых различными объектами. Например, как выяснить, какие операции доступны для строки?
В зависимости от вашей среды Python вы, возможно, сможете увидеть список доступных методов с помощью автодополнения по табуляции. Например, попробуйте ввести это:
>>> s = 'hello world'
>>> s.<tab key>
>>>
Если нажатие клавиши Tab не имеет эффекта, вы можете использовать встроенную функцию dir(). Например:
>>> s = 'hello'
>>> dir(s)
['__add__', '__class__', '__contains__',..., 'find', 'format',
'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit',
'rstrip','split','splitlines','startswith','strip','swapcase',
'title', 'translate', 'upper', 'zfill']
>>>
dir() возвращает список всех операций, которые могут следовать после (.). Используйте команду help() для получения дополнительной информации о конкретной операции:
>>> help(s.upper)
Help on built-in function upper:
upper(...)
S.upper() -> string
Return a copy of the string S converted to uppercase.
>>>
Поздравляем! Вы завершили лабораторную работу по строкам. Вы можете практиковаться в более лабораторных работах в LabEx, чтобы улучшить свои навыки.