Язык программирования 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.