Язык программирования Python.
Строки.
Строки в языке Python являются типом данных, специально предназначенным для обработки текстовой информации. Строка может содержать произвольно длинный текст (ограниченный имеющейся памятью).
В новых версиях Python имеются два типа строк: обычные строки (последовательность байтов) и Unicode–строки (последовательность символов). В Unicode–строке каждый символ может занимать в памяти 2 или 4 байта, в зависимости от настроек периода компиляции. Четырехбайтовые знаки используются в основном для восточных языков.
Примечание: В языке и стандартной библиотеке за некоторыми исключениями строки и Unicode–строки взаимозаменяемы, в собственных приложениях для совместимости с обоими видами строк следует избегать проверок на тип. Если это необходимо, можно проверять принадлежность базовому (для строк и Unicode–строк) типу с помощью isinstance(s, basestring).При использовании Unicode–строк, следует мысленно принять точку зрения, относительно которой именно Unicode–представление является главным, а все остальные кодировки — лишь частные случаи представления текста, которые не могут передать всех символов. Без такой установки будет непонятно, почему преобразование из восьмибитной кодировки называется decode (декодирование). Для внешнего представления можно с успехом использовать кодировку UTF–8, хотя, конечно, это зависит от решаемых задач.
Кодировка Python–программы.
Для того чтобы Unicode–литералы в Python–программе воспринимались интерпретатором правильно, необходимо указать кодировку в начале программы, записав в первой или второй строке примерно следующее (для Unix/Linux):
# -*- coding: koi8–r -*-
Или (под Windows):
# -*- coding: cp1251 -*-
Могут быть и другие варианты:
# -*- coding: latin–1 -*-
# -*- coding: utf–8 -*-
# -*- coding: mac–cyrillic -*-
# -*- coding: iso8859–5 -*-
Полный перечень кодировок (и их псевдонимов):
>>> import encodings.aliases.
>>> print encodings.aliases.aliases.
{'iso_ir_6': 'ascii', 'maccyrillic': 'mac_cyrillic',
'iso_celtic': 'iso8859_14', 'ebcdic_cp_wt': 'cp037',
'ibm500': 'cp500', ...
Если кодировка не указана, то считается, что используется us–ascii. При этом интерпретатор Python будет выдавать предупреждения при запуске модуля:
Sys:1: DeprecationWarning: Non–ASCII character '\xf0' in file example.py.
On line 2, but no encoding declared;
See http://www.python.org/peps/pep–0263.html for details.
Строковые литералы.
Строки можно задать в программе с помощью строковых литералов. Литералы записываются с использованием апострофов ', кавычек " или этих же символов, взятых трижды. Внутри литералов обратная косая черта имеет специальное значение. Она служит для ввода специальных символов и для указания символов через коды. Если перед строковым литералом поставлено r, обратная косая черта не имеет специального значения ( r от английского слова raw, строка задается «как есть»). Unicode–литералы задаются с префиксом u. Вот несколько примеров:
S1 = "строка 1".
S2 = r'\1\2'.
S3 = """apple\ntree""" # \n — символ перевода строки.
S4 = """apple.
Tree""" # строка в утроенных кавычках может иметь внутри переводы строк.
S5 = '\x73\65'.
U1 = u"Unicode literal".
U2 = u'\u0410\u0434\u0440\u0435\u0441'.
Примечание: Обратная косая черта не должна быть последним символом в литерале, то есть, "str\" вызовет синтаксическую ошибку.Указание кодировки позволяет применять в Unicode–литералах указанную в начале программы кодировку. Если кодировка не указана, можно пользоваться только кодами символов, заданными через обратную косую черту.
Операции над строками.
К операциям над строками, которые имеют специальную синтаксическую поддержку в языке, относятся, в частности конкатенация (склеивание) строк, повторение строки, форматирование:
>>> print "A" + "B", "A"*5, "%s" % "A".
AB AAAAA A.
В операции форматирования левый операнд является строкой формата, а правый может быть либо кортежем, либо словарем, либо некоторым значением другого типа:
>>> print "%i" % 234.
234.
>>> print "%i %s %3.2f" % (5, "ABC", 23.45678).
5 ABC 23.46.
>>> a = 123.
>>> b = [1, 2, 3].
>>> print "%(a)i: %(b)s" % vars().
123: [1, 2, 3].
Операция форматирования.
В строке формата кроме текста могут употребляться спецификации, регламентирующие формат выводимого значения. Спецификация имеет синтаксис.
"%" [ключ][флаг*][шир][.точность][длина_типа]спецификатор.
Ключ: "(" символ за исключением круглых скобок* ")".
Флаг: "+" | "-" | пробел | "#" | "0".
Шир: ("1" ... "9")("0" ... "9")* | "*".
Точность: ("1" ... "9")* | "*".
Длина_типа: "a" ... "z" | "A" ... "Z".
Спецификатор: "a" ... "z" | "A" ... "Z" | "%".
Где символы обозначают следующее:
Ключ.
Ключ из словаря.
Флаги.
Дополнительные свойства преобразования.
Шир.
Минимальная ширина поля.
Точность.
Точность (для чисел с плавающей запятой).
Длина_типа.
Модификатор типа.
Спецификатор.
Тип представления выводимого объекта.
В следующей таблице приведены некоторые наиболее употребительные значения для спецификации форматирования.
| Символ | Где применяется | Что указывает |
|---|---|---|
| 0 | флаг | Заполнение нулями слева |
| - | флаг | Выравнивание по левому краю |
| + | флаг | Обязательный вывод знака числа |
| пробел | флаг | Использовать пробел на месте знака числа |
| d, i | спецификатор | Знаковое целое |
| u | спецификатор | Беззнаковое целое |
| o | спецификатор | Восьмеричное беззнаковое целое |
| x, X | спецификатор | Шестнадцатеричное беззнаковое целое (со строчными или прописными латинскими буквами) |
| e, E | спецификатор | Число с плавающей запятой в формате с экспонентой |
| f, F | спецификатор | Число с плавающей запятой |
| g, G | спецификатор | Число с плавающей точкой в более коротком написании (автоматически выбирается e или f) |
| с | спецификатор | Одиночный символ (целое число или односимвольная строка) |
| r | спецификатор | Любой объект, приведенный к строке функцией repr() |
| s | спецификатор | Любой объект, приведенный к строке функцией str() |
| % | спецификатор | Знак процента. Для задания одиночного процента необходимо записать %% |
Индексы и срезы.
Следует напомнить, что строки являются неизменчивыми последовательностями, поэтому к ним можно применять операции взятия элемента по индексу и срезы:
>>> s = "транспорт".
>>> print s[0], s[-1].
Т т.
>>> print s[-4:].
Порт.
>>> print s[:5].
Транс.
>>> print s[4:8].
Спор.
Примечание: При выделении среза нумеруются не символы строки, а промежутки между ними.Модуль string.
До того как у строк появились методы, для операций над строками применялся модуль string. Приведенный пример демонстрирует, как вместо функции из string использовать метод (кстати, последнее более эффективно):
>>> import string.
>>> s = "one,two,three".
>>> print string.split(s, ",").
['one', 'two', 'three'].
>>> print s.split(",").
['one', 'two', 'three'].
В версии Python 3.0 функции, которые доступны через методы, более не будут дублироваться в модуле string.
В Python 2.4 появилась альтернатива использованию операции форматирования: класс Template. Пример:
>>> import string.
>>> tpl = string.Template("$a + $b = ${c}").
>>> a = 2.
>>> b = 3.
>>> c = a + b.
>>> print tpl.substitute(vars()).
2 + 3 = 5.
>>> del c # удаляется имя c.
>>> print tpl.safe_substitute(vars()).
2 + 3 = $c.
>>> print tpl.substitute(vars(), c=a+b).
2 + 3 = 5.
>>> print tpl.substitute(vars()).
Traceback (most recent call last):
File "/home/rnd/tmp/Python–2.4b2/Lib/string.py", line 172, in substitute.
return self.pattern.sub(convert, self.template).
File "/home/rnd/tmp/Python–2.4b2/Lib/string.py", line 162, in convert.
val = mapping[named].
KeyError: 'c'.
Объект–шаблон имеет два основных метода: substitute() и safe_substitute(). Значения для подстановки в шаблон берутся из словаря ( vars() содержит словарь со значениями переменных) или из именованных фактических параметров. Если есть неоднозначность в задании ключа, можно использовать фигурные скобки при написании ключа в шаблоне.
Методы строк.
В таблице ниже приведены некоторые наиболее употребительные методы объектов–строк и unicode–объектов.
| Метод | Описание |
|---|---|
| center(w) | Центрирует строку в поле длины w |
| count(sub) | Число вхождений строки sub в строке |
| encode([enc[, errors]]) | Возвращает строку в кодировке enc. Параметр errors может принимать значения « strict» (по умолчанию), « ignore», « replace» или « xmlcharrefreplace» |
| endswith(suffix) | Оканчивается ли строка на suffix |
| expandtabs([tabsize]) | Заменяет символы табуляции на пробелы. По умолчанию tabsize=8 |
| find(sub [,start [,end]]) | Возвращает наименьший индекс, с которого начинается вхождение подстроки sub в строку. Параметры start и end ограничивают поиск окном start:end, но возвращаемый индекс соответствует исходной строке. Если подстрока не найдена, возвращается –1 |
| index(sub[, start[, end]]) | Аналогично find(), но возбуждает исключение ValueError в случае неудачи |
| alnum() | Возвращает True, если строка содержит только буквы и цифры и имеет ненулевую длину. Иначе — False |
| isalpha() | Возвращает True, если строка содержит только буквы и длина ненулевая |
| isdecimal() | Возвращает True, если строка содержит только десятичные знаки (только для строк Unicode) и длина ненулевая |
| isdigit() | Возвращает True, если содержит только цифры и длина ненулевая |
| islower() | Возвращает True, если все буквы строчные (и их более одной), иначе — False |
| isnumeric() | Возвращает True, если в строке только числовые знаки (только для Unicode) |
| isspace() | Возвращает True, если строка состоит только из пробельных символов. Внимание! Для пустой строки возвращается False |
| join(seq) | Соединение строк из последовательности seq через разделитель, заданный строкой |
| lower() | Приводит строку к нижнему регистру букв |
| lstrip() | Удаляет пробельные символы слева |
| replace(old, new[, n]) | Возвращает копию строки, в которой подстроки old заменены new. Если задан параметр n, то заменяются только первые n вхождений |
| rstrip() | Удаляет пробельные символы справа |
| split([sep[, n]]) | Возвращает список подстрок, получающихся разбиением строки a разделителем sep. Параметр n определяет максимальное количество разбиений (слева) |
| startswith(prefix) | Начинается ли строка с подстроки prefix |
| strip() | Удаляет пробельные символы в начале и в конце строки |
| translate(table) | Производит преобразование с помощью таблицы перекодировки table, содержащей словарь для перевода кодов в коды (или в None, чтобы удалить символ). Для Unicode–строк |
| translate(table[, dc]) | То же, но для обычных строк. Вместо словаря — строка перекодировки на 256 символов, которую можно сформировать с помощью функции string.maketrans(). Необязательный параметр dc задает строку с символами, которые необходимо удалить |
| upper() | Переводит буквы строки в верхний регистр |
В следующем примере применяются методы split() и join() для разбиения строки в список (по разделителям) и обратное объединение списка строк в строку.
>>> s = "This is an example.".
>>> lst = s.split(" ").
>>> print lst.
['This', 'is', 'an', 'example.'].
>>> s2 = "\n".join(lst).
>>> print s2.
This.
Is.
An.
Example.
Для проверки того, оканчивается ли строка на определенное сочетание букв, можно применить метод endswith():
>>> filenames = ["file.txt", "image.jpg", "str.txt".
>>> for fn in filenames:
... if fn.lower().endswith(".txt"):
... print fn.
...
File.txt.
Str.txt.
Поиск в строке можно осуществить с помощью метода find(). Следующая программа выводит все функции, определенные в модуле оператором def:
Import string.
Text = open(string.__file__[:-1]).read().
Start = 0.
While 1:
found = text.find("def ", start).
If found == -1:
break.
Print text[found:found + 60].split("(")[0].
Start = found + 1.
Важным для преобразования текстовой информации является метод replace(), который рассматривается ниже:
>>> a = "Это текст , в котором встречаются запятые , поставленные не так.".
>>> b = a.replace(" ,", ",").
>>> print b.
Это текст, в котором встречаются запятые, поставленные не так.
Рекомендации по эффективности.
При работе с очень длинными строками или большим количеством строк, применяемые операции могут по–разному влиять на быстродействие программы.
Например, не рекомендуется многократно использовать операцию конкатенации для склеивания большого количества строк в одну. Лучше накапливать строки в списке, а затем с помощью join() собирать в одну строку:
>>> a = "".
>>> for i in xrange(1000):
... a += str(i) # неэффективно!
...
>>> a = "".join([str(i) for i in xrange(1000)]) # более эффективно.
Конечно, если строка затем обрабатывается, можно применять итераторы, которые позволят свести использование памяти к минимуму.
Модуль StringIO.
В некоторых случаях желательно работать со строкой как с файлом. Модуль StringIO как раз дает такую возможность.
Открытие «файла» производится вызовом StringIO(). При вызове без аргумента — создается новый «файл», при задании строки в качестве аргумента — «файл» открывается для чтения:
Import StringIO.
My_string = «1234567890».
F1 = StringIO.StringIO().
F2 = StringIO.StringIO(my_string).
Далее с файлами f1 и f2 можно работать как с обычными файловыми объектами.
Для получения содержимого такого файла в виде строки применяется метод getvalue():
F1.getvalue().
Противоположный вариант (представление файла на диске в виде строки) можно реализовать на платформах Unix и Windows с использованием модуля mmap. Здесь этот модуль рассматриваться не будет.
Модуль difflib.
Для приблизительного сравнения двух строк в стандартной библиотеке предусмотрен модуль difflib.
Функция difflib.get_close_matches() позволяет выделить n близких строк к заданной строке:
Get_close_matches(word, possibilities, n=3, cutoff=0.6).
Где.
Word.
Строка, к которой ищутся близкие строки.
Possibilities.
Список возможных вариантов.
N.
Требуемое количество ближайших строк.
Cutoff.
Коэффициент (из диапазона [0, 1]) необходимого уровня совпадения строк. Строки, которые при сравнении с word дают меньшее значение, игнорируются.
Следующий пример показывает функцию difflib.get_close_matches() в действии:
>>> import unicodedata.
>>> names = [unicodedata.name(unicode(chr(i))) for i in range(40, 127)].
>>> print difflib.get_close_matches("LEFT BRACKET", names).
['LEFT CURLY BRACKET', 'LEFT SQUARE BRACKET'].
В списке names — названия Unicode–символов с ASCII–кодами от 40 до 127.
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.