ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 736
Скачиваний: 16
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
64
>>> 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]
22.4. Операция форматирования
В строке формата кроме текста могут употребляться специфи- кации, регламентирующие формат выводимого значения. Специфи- кация имеет синтаксис:
"%" [ключ][флаг*][шир][.точность][длина_типа]спецификатор ключ: "(" символ за исключением круглых скобок* ")" флаг: "+" | "-" I пробел I "#" I "0" шир: (" 1" ... "9")("0" ... "9")* ( "*" точность: ("1" ... " 9")* | " *" длина_типа: "а" ... "z" I "A" ... "Z" спецификатор: "а" ... "z" I "A" ... "z" I"%"
Здесь символы обозначают следующее:
ключ – ключ из словаря;
флаг – дополнительные свойства преобразования;
шир – минимальная ширина поля;
точность – точность (для чисел с плавающей запятой);
длина_типа – модификатор типа;
спецификатор – тип представления выводимого объекта.
В следующей таблице приведены некоторые наиболее употре- бительные значения для спецификации форматирования.
Символ Применение
Обозначение
1 2
3 0
Флаг
Заполнение нулями слева
-
Флаг
Выравнивание по левому краю
+
Флаг
Обязательный вывод знака числа
Пробел
Флаг
Использовать пробел на месте знака числа d, i
Специфика- тор
Знаковое целое
65
Окончание таблицы
1 2
3 u
Спецификатор Беззнаковое целое o
Спецификатор Восьмеричное беззнаковое целое х, Х
Спецификатор Шестнадцатеричное беззнаковое целое
(со строчными или прописными латин- скими буквами) е, Е
Спецификатор Число с плавающей запятой в формате с экспонентой f, F
Спецификатор Число с плавающей запятой g,G
Спецификатор Число с плавающей точкой в более ко- ротком написании (автоматически вы- бирается е или f) c
Спецификатор Одиночный символ (целое число или односимвольная строка) r
Спецификатор Любой объект, приведенный к строке функцией rерr() s
Спецификатор Любой объект, приведенный к строке функцией str()
%
Спецификатор Знак процента. Для задания одиночного процента необходимо записать %%
22.5. Индексы и срезы
Следует напомнить, что строки являются неизменчивыми после- довательностями, поэтому к ним можно применять операции взятия элемента по индексу и срезы:
>>> s = "транспорт"
>>> print s[0], s[-1] т т
>>> print s[-4:] порт
>>> print s[:5] транс
>>> print s[4:8] спор
66
При выделении среза нумеруются не символы строки, а проме- жутки между ними.
22.6. Модуль string
До того как у строк появились методы, для операций над стро- ками применялся модуль string. Приведенный пример демонстриру- ет, как вместо функции из модуля string использовать метод (кстати, последнее более эффективно):
>>> import string
>>> s = "one,two,three"
>>> print string.split(s, ",")
['one', 'two', 'three']
>>> print s.split(",")
['one', 'two', 'three']
В Python 2.4 появилась альтернатива использованию операции форматирования – класс Template. Пример:
>>>import string
>>>tpl = string.Template("$a + $b = ${c}")
>>>а = 2
>>>b = 3
>>>с = a + b
>>>print tp1.substitute(vars())
2+3=5
>>>del с
# удаляется имя с
>>>print tp1.safe_substitute(vars() )
2 + 3 = $c
>>>print tp1.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:'с'
67
Объект-шаблон имеет два основных метода: substitute() и safe_substitute(). Значения для подстановки в шаблон берутся из словаря (vars() содержит словарь со значениями переменных) или из именованных фактических параметров. Если есть неоднозначность в задании ключа, можно использовать фигурные скобки при написа- нии ключа в шаблоне.
22.7. Методы строк
В таблице ниже приведены некоторые наиболее употребитель- ные методы объектов-строк и Unicode-объектов.
Метод
Описание
1 2 center(w)
Центрирует строку в поле длины w count(sub)
Число вхождений строки sub в строке encode([enc[,errors]]) Возвращает строку в кодировке еnс. Пара- метр errors может принимать значения "strict" (по умолчанию), "ignore", "replace" или "xmlcharrefrepiace" endswith(suffix)
Определяет, оканчивается ли строка на suffix expandtabs([tabsize]) Заменяет символы табуляции на пробелы. По умолчанию tabsize=8 find(sub[,start[,end]]) Возвращает наименьший индекс, с которого начинается вхождение подстроки sub в стро- ку. Параметры start и end ограничивают по- иск окном start: end, но возвращаемый ин- декс соответствует исходной строке.
Если подстрока не найдена, возвращается -1 index(sub[,start[,end]]) Аналогично find(), но возбуждает исключе- ние ValueError в случаенеудачи isalnum()
Возвращает true,если строка содержит только буквы и цифры и имеет ненулевую длину.
Иначе – False
68
Продолжение таблицы
1 2 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]])
Возвращает список подстрок, получающихся разбиением строки а разделителем sep.
Параметр n определяет максимальное коли- чество разбиений (слева) startswith(prefix) Определяет, начинается ли строка с подстро- ки prefix strip()
Удаляет пробельные символы в начале и в конце строки
69
Окончание таблицы
1 2 translate(table)
Производит преобразование с помощью таб- лицы перекодировки table, содержащей сло- варь для перевода кодов в коды (или в
None,чтобы удалить символ) translate (table[,dc]) Для Unicode-строк. То же, но для обычных строк. Вместо словаря – строка перекодировки на 256 символов, которую можно сформиро- вать с помощью функций string, maketrans().
Необязательный параметр dc задает строку с символами, которые необходимо удалить upper()
Переводит буквы строки в верхний регистр
В следующем примере применяются методы split() и join() для разбиения строки в список (по разделителям) и обратное объединение списка строк в строку:
>>> s = "This is an example."
>>> 1st = s.split(" ")
>>> print 1st
['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
70
Поиск в строке можно осуществить с помощью метода 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(), который рассматривается ниже:
>>>а="Это текст , в котором встречаются запятые , поставлен- ные не так."
>>>b
= a.replace(" ,", ",")
>>> print b
При работе с очень длинными строками или большим количе- ством строк применяемые операции могут по-разному влиять на быстродействие программы. Например, не рекомендуется многократ- но использовать операцию конкатенации для склеивания большого количества строк в одну. Лучше накапливать строки в списке, а затем с помощью joint() собирать в одну строку:
>>>а = " "
>>>for i in xrange(1000): а += str(i) # неэффективно!
>>>а=" ".join([str(i) for i in xrange(1000)])#эффект.
Если строка затем обрабатывается, можно применять итераторы, которые позволят свести использование памяти к минимуму.
71
22.8. Модуль StringIO
В некоторых случаях желательно работать со строкой как с фай- лом. Модуль StringlO как раз дает такую возможность. Открыть файл можно с помощью модуля StringIO(). При вызове без аргумента со- здается новый файл, при задании строки в качестве аргумента – файл открывается для чтения: import StringIO my_string = "1234567890" f1 = StringIO.StringlO() f2 = StringIO.StringlO(my_string)
Далее с файлами f1 и f2 можно работать как с обычными файло- выми объектами. Для получения содержимого такого файла в виде строки применяется метод getvalue (): f1.getvalue().
Противоположный вариант (представление файла на диске в ви- де строки) можно реализовать на платформах Unix и Windows с ис- пользованием модуля mmap.
22.9. Модуль difflib
Для приблизительного сравнения двух строк в стандартной биб- лиотеке предусмотрен модуль difflib.
Функция difflib.get_close_matches()выделяет n близких строк к заданной строке: get_close_matches(word,possibilities,n=3,cutoff=0.6), где word – строка, к которой ищутся близкие строки. Здесь possibilities – список возможных вариантов, n – требуемое количество ближайших строк, cutoff – коэффициент (из диапазона [0,1]) необходимого уровня сов- падения строк. Строки, которые при сравнении с word дают меньшее значение, игнорируются.
22.10. Регулярные выражения
Рассмотренных стандартных возможностей для работы с тек- стом достаточно не всегда. Например, в методах find() и replace() за- дается всего одна строка. В реальных задачах такая однозначность встречается довольно редко, чаще требуется найти или заменить строки, отвечающие некоторому шаблону.
72
Регулярные выражения (regular expressions) описывают мно- жество строк с помощью специального языка, который будет рас- смотрен ниже. (Строка, в которой задано регулярное выражение, бу- дет называться шаблоном.)
Для работы с регулярными выражениями в Python используется модуль re. В следующем примере регулярное выражение помогает выделить из текста все числа:
>>> import re
>>> pattern = r"[0-9]+"
>>> number_re = re.compile(pattern)
>>> number_re.findall("122 234 65435")
['122', '234', '65435']
В этом примере шаблон pattern описывает множество строк, ко- торые состоят из одного или более символов из набора "0", "1", ...,
"9". Функция re.compile() компилирует шаблон в специальный
Regex-объект, который имеет несколько методов, в том числе метод findall() для получения списка всех непересекающихся вхождений строк, удовлетворяющих шаблону, в заданную строку. То же самое можно было сделать и так:
>>> import re
>>> re.findall(r"[0-9]+", "122 234 65435")
['122', '234', '65435']
Предварительная компиляция шаблона предпочтительнее при его частом использовании, особенно внутри цикла. Следует заметить, что для задания шаблона использована необработанная строка. В данном примере она не требовалась, но в общем случае лучше запи- сывать строковые литералы именно так, чтобы исключить влияние специальных последовательностей, записываемых через обратную косую черту.
22.11. Синтаксис регулярного выражения
Синтаксис регулярных выражений в Python почти такой же, как в других инструментах. Часть символов (в основном буквы и цифры) обозначают сами себя. Строка удовлетворяет (соответствует) шабло- ну, если она входит во множество строк, которые этот шаблон опи- сывает. Различные операции используют шаблон по-разному. Так,
73 search() ищет первое вхождение строки, удовлетворяющей шаблону, в заданной строке, a match() требует, чтобы строка удовлетворяла шаблону с самого начала. Символы, имеющие специальное значение в записи регулярных выражений, приведены ниже.
Символ Обозначение в регулярном выражении "."
Любой символ "^"
Начало строки "$"
Конец строки "*"
Повторение фрагмента нуль или более раз («жадное»)
"+"
Повторение фрагмента один или более раз («жадное»)
"?"
Предыдущий фрагмент либо присутствует, либо отсут- ствует "{m, n}" Повторение предыдущего фрагмента от m до n раз включительно («жадное»)
"[...]"
Любой символ из набора в скобках. Можно задавать диапазоны символов с идущими подряд кодами, напри- мер: a-z
"[^... ]"
Любой символ не из набора в скобках "\"
Обратная косая черта отменяет специальное значение следующего за ней символа "I"
Фрагмент справа или фрагмент слева "* ?"
Повторение фрагмента нуль или более раз («нежадное»)
"+ ?"
Повторение фрагмента один или более раз («нежадное»)
"{m, n} ?" Повторение предыдущего фрагмента от m до n раз включительно («нежадное»)
Если А и В – регулярные выражения, то их конкатенация АВ яв- ляется новым регулярным выражением, причем конкатенация строк а и b будет удовлетворять АВ, если а удовлетворяет А и b удовлетворя- ет В. Можно считать, что конкатенация – основной способ составле- ния регулярных выражений.
Скобки, описанные ниже, применяются для задания приорите- тов и выделения групп (фрагментов текста, которые потом можно по- лучить по номеру или из словаря и даже сослаться в том же регуляр- ном выражении).
74
Алгоритм, который сопоставляет строки с регулярным выраже- нием, проверяет соответствие того или иного фрагмента строки регу- лярному выражению.
Например, строка "а" соответствует регулярному выражению "[a-z]",строка "fruit" соответствует "fruitIvegetable", а вот строка "ap- ple" не соответствует шаблону "pineapple".
В таблице вместо регвыр может быть записано регулярное выра- жение, вместо имя – идентификатор, а флаги будут рассмотрены ниже.
Обозначение
Описание
1 2
" (регвыр)"
Обособляет регулярное выражение в скобках и выделяет группу " (? •.регвыр)"
Обособляет регулярное выражение в скобках без выделения группы " (?=регвыр)"
Просмотр вперед: строка должна соответство- вать заданному регулярному выражению, но дальнейшее сопоставление с шаблоном начнет- ся с того же места " (? !регвыр) "
То же, но с отрицанием соответствия " (?<=регвыр)"
Просмотр назад: строка должна соответствовать регулярному выражению. Не занимает места в строке, к которой применяется шаблон. Пара- метр регвыр должен быть фиксированной дли- ны (то есть без "+" и "*")
" (?
То же, но с отрицанием соответствия "(?р<имя>регвыр)" Выделяет именованную группу с именем <имя>
" (?Р=имя)"
Точно соответствует выделенной ранее имено- ванной группе с именем <имя>
" (?#регвыр)"
Комментарий (игнорируется)
"(?(имя)рв1|рв2)"
Если группа с номером или именем <имя> ока- залась определена, то результатом будет сопо- ставление с рв1, иначе – срв2. Часть рв2 может отсутствовать
75
Окончание таблицы
1 2
" (? флаг)"
Задает флаг для всего данного регулярного вы- ражения. Флаги необходимо задавать в начале шаблона
В таблице описаны специальные последовательности, в которых используется обратная косая черта.
Последовательность
Значение
1 2
"\1" – "\9"
Группа с указанным номером группы ну- меруется начиная с 1
" \А"
Промежуток перед началом всей строки
(почти аналогично "^")
" \Z"
Промежуток перед концом всей строки
(почти аналогично " $")
" \b"
Промежуток между символами перед сло- вом или после него " \В"
Наоборот, не соответствует промежутку между символами на границе слова " \d"
Цифра (аналогично "[ 0 – 9 ]")
" \D"
Не цифра (аналогично "[" 0 – 9 ]")
" \s"
Любой пробельный символ (аналогично
"[\t\n\r\f\v]")
" \S"
Любой непробельный символ (аналогично "[^t\n\r\f\v]")
"\w"
Любая цифра или буква (зависит от флага
LOCALE)
"\W"
Любой символ, не являющийся цифрой или буквой (зависит от флага LOCALE)