Текст книги "Язык программирования Python"
Автор книги: Роман Сузи
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 7 (всего у книги 16 страниц) [доступный отрывок для чтения: 7 страниц]
load(file) Чтение массива из файла file. Файл должен быть открыт в бинарном режиме
loads(s) Возвращает объект, соответствующий бинарному представлению, заданному в строке
nonzero(a) Возвращает индексы ненулевых элементов одномерного массива
ones(shape[, type]) Массив из единиц заданной формы shape и обозначения типа type
outerproduct(a, b) Внешнее произведение a и b
product(a[, axis]) Произведение по измерению axis массива a
put(a, indices, b) Присваивание частям массива, a[n] = b[n] для всех индексов indices
putmask(a, mask, b) Присваивание a элементов из b, для которых маска mask имеет значение истина
ravel(a) Превращение массива в одномерный. Аналогично reshape(a, (-1,))
repeat(a, n[, axis]) Повторяет элементы массива a n раз по измерению axis
reshape(a, shape) Возвращает массив нужной формы (нового массива не создает). Количество элементов в исходном и новом массивах должно совпадать
resize(a, shape) Возвращает массив с произвольной новой формой shape. Размер исходного массива не важен
searchsorted(a, i) Для каждого элемента из i найти место в массиве a. Массив a должен быть одномерным и отсортированным. Результат имеет форму массива i
shape(a) Возвращает форму массива a
sometrue(a[, axis]) Логическое ИЛИ по всему измерению axis массива a
sort(a[, axis]) Сортировка элементов массива по заданному измерению
sum(a[, axis]) Суммирование по измерению axis массива a
swapaxes(a, axis1, axis1) Смена измерений (частный случай транспонирования)
take(a, indices[, axis]) Выбор частей массива a на основе индексов indices по измерению axis
trace(a[, k[, axis1[, axis2]]]) Сумма элементов вдоль диагонали, то есть add.reduce(diagonal(a, k, axis1, axis2))
transpose(a[, axes]) Перестановка измерений в соответствии с axes, либо, если axes не заданы – расположение их в обратном порядке
where(cond, a1, a2) Выбор элементов на основании условия cond из a1 (если не нуль) и a2 (при нуле) поэлементно. Равносилен choose(not_equal(cond, 0), (y, x)). Формы массивов–аргументов a1 и a2 должны совпадать
zeros(shape[, type]) Массив из нулей заданной формы shape и обозначения типа type
В этой таблице в качестве обозначения типа type можно указывать рассмотренные выше константы: Int, Float и т.п.
Модуль Numeric также определяет константы e (число e) и pi (число пи).
Модуль LinearAlgebra
Модуль LinearAlgebra содержит алгоритмы линейной алгебры, в частности нахождение определителя матрицы, решений системы линейных уравнений, обращение матрицы, нахождение собственных чисел и собственных векторов матрицы, разложение матрицы на множители: Холецкого, сингулярное, метод наименьших квадратов.
Функция LinearAlgebra.determinant() находит определитель матрицы:
Листинг
>>> import Numeric, LinearAlgebra
>>> print LinearAlgebra.determinant(
… Numeric.array([[1, – 2],
… [1, 5]]))
7
Функция LinearAlgebra.solve_linear_equations() решает линейные уравнения вида ax=b по заданным аргументам a и b:
Листинг
>>> import Numeric, LinearAlgebra
>>> a = Numeric.array([[1.0, 2.0], [0.0, 1.0]])
>>> b = Numeric.array([1.2, 1.5])
>>> x = LinearAlgebra.solve_linear_equations(a, b)
>>> print «x =", x
x = [-1.8 1.5]
>>> print «Проверка:", Numeric.dot(a, x) – b
Проверка: [ 0. 0.]
Когда матрица a имеет нулевой определитель, система имеет не единственное решение и возбуждается исключение LinearAlgebraError:
Листинг
>>> a = Numeric.array([[1.0, 2.0], [0.5, 1.0]])
>>> x = LinearAlgebra.solve_linear_equations(a, b)
Traceback (most recent call last):
File "
File "/usr/local/lib/python2.3/site–packages/Numeric/LinearAlgebra.py», line 98,
in solve_linear_equations raise LinAlgError, 'Singular matrix'
LinearAlgebra.LinAlgError: Singular matrix
Функция LinearAlgebra.inverse() находит обратную матрицу. Однако не следует решать линейные уравнения с помощью LinearAlgebra.inverse() умножением на обратную матрицу, так как она определена через LinearAlgebra.solve_linear_equations():
Листинг
def inverse(a):
return solve_linear_equations(a, Numeric.identity(a.shape[0]))
Функция LinearAlgebra.eigenvalues() находит собственные значения матрицы, а LinearAlgebra.eigenvectors() – пару: собственные значения, собственные вектора:
Листинг
>>> from Numeric import array, dot
>>> from LinearAlgebra import eigenvalues, eigenvectors
>>> a = array([[-5, 2], [2, – 7]])
>>> lmd = eigenvalues(a)
>>> print «Собственные значения:", lmd
Собственные значения: [-3.76393202–8.23606798]
>>> (lmd, v) = eigenvectors(a)
>>> print «Собственные вектора:"
Собственные вектора:
>>> print v
[[ 0.85065081 0.52573111]
[-0.52573111 0.85065081]]
>>> print «Проверка:", dot(a, v[0]) – v[0] * lmd[0]
Проверка: [ -4.44089210e–16 2.22044605e–16]
Проверка показывает, что тождество выполняется с достаточно большой точностью (числа совсем маленькие, практически нули): собственные числа и векторы найдены верно.
Модуль RandomArray
В этом модуле собраны функции для генерации массивов случайных чисел различных распределений и свойств. Их можно применять для математического моделирования.
Функция RandomArray.random() создает массивы из псевдослучайных чисел, равномерно распределенных в интервале (0, 1):
Листинг
>>> import RandomArray
>>> print RandomArray.random(10) # массив из 10 псевдослучайных чисел
[ 0.28374212 0.19260929 0.07045474 0.30547682 0.10842083 0.14049676
0.01347435 0.37043894 0.47362471 0.37673479]
>>> print RandomArray.random([3,3]) # массив 3x3 из псевдослучайных чисел
[[ 0.53493741 0.44636754 0.20466961]
[ 0.8911635 0.03570878 0.00965272]
[ 0.78490953 0.20674807 0.23657821]]
Функция RandomArray.randint() для получения массива равномерно распределенных чисел из заданного интервала и заданной формы:
Листинг
>>> print RandomArray.randint(1, 10, [10])
[8 1 9 9 7 5 2 5 3 2]
>>> print RandomArray.randint(1, 10, [10])
[2 2 5 5 7 7 3 4 3 7]
Можно получать и случайные перестановки с помощью RandomArray.permutation():
Листинг
>>> print RandomArray.permutation(6)
[4 0 1 3 2 5]
>>> print RandomArray.permutation(6)
[1 2 0 3 5 4]
Доступны и другие распределения для получения массива нормально распределенных величин с заданным средним и стандартным отклонением:
Листинг
>>> print RandomArray.normal(0, 1, 30)
[-1.0944078 1.24862444 0.20415567–0.74283403 0.72461408–0.57834256
0.30957144 0.8682853 1.10942173–0.39661118 1.33383882 1.54818618
0.18814971 0.89728773–0.86146659 0.0184834 -1.46222591–0.78427434
1.09295738–1.09731364 1.34913492–0.75001568–0.11239344 2.73692131
– 0.19881676–0.49245331 1.54091263–1.81212211 0.46522358–0.08338884]
Следующая таблица приводит функции для других распределений:
Функция и ее аргументы Описание
F(dfn, dfd, shape=[]) F–распределение
beta(a, b, shape=[]) Бета–распределение
binomial(trials, p, shape=[]) Биномиальное распределение
chi_square(df, shape=[]) Распределение хи–квадрат
exponential(mean, shape=[]) Экспоненциальное распределение
gamma(a, r, shape=[]) Гамма–распределение
multivariate_normal(mean, cov, shape=[]) Многомерное нормальное распределение
negative_binomial(trials, p, shape=[]) Негативное биномиальное
noncentral_F(dfn, dfd, nconc, shape=[]) Нецентральное F–распределение
noncentral_chi_square(df, nconc, shape=[]) Нецентральное хи–квадрат распределение
normal(mean, std, shape=[]) Нормальное распределение
permutation(n) Случайная перестановка
poisson(mean, shape=[]) Пуассоновское распределение
randint(min, max=None, shape=[]) Случайное целое
random(shape=[]) Равномерное распределение на интервале (0, 1)
random_integers(max, min=1, shape=[]) Случайное целое
standard_normal(shape=[]) Стандартное нормальное распределение
uniform(min, max, shape=[]) Равномерное распределение
Заключение
В этой лекции рассматривался набор модулей для численных вычислений. Модуль Numeric определяет тип многомерный массив и множество функций для работы с массивами. Также были представлены модули для линейной алгебры и моделирования последовательностей случайных чисел различных распределений.
6. Лекция: Обработка текстов. Регулярные выражения. Unicode.
В этой лекции дается краткое представление о возможностях языка Python по обработке текстовой информации. Рассмотрены синтаксис и семантика регулярных выражений, а также некоторые вопросы использования Unicode.
Под обработкой текстов понимается анализ, преобразование, поиск, порождение текстовой информации. По большей части работа с естественными текстами не будет глубже, чем это возможно без систем искусственного интеллекта. Кроме того, здесь предполагается опустить рассмотрение обработки текстов посредством текстовых процессоров и редакторов, хотя некоторые из них (например, Cooledit) предоставляют возможность писать макрокоманды на Python.
Следует отметить, что для Python созданы также модули для работы с естественными языками, а также для лингвистических исследований. Хорошим учебным примером может служить nltk (the Natural Language Toolkit).
Стоит отметить проект PyParsing (сайт:http://pyparsing.sourceforge.net), с помощью которого можно организовать обработку текста по заданной грамматике.
Строки
Строки в языке 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'12'
s3 = ""«applentree»"" # n – символ перевода строки
s4 = ""«apple
tree»"" # строка в утроенных кавычках может иметь внутри переводы строк
s5 = 'x7365'
u1 = u»Unicode literal»
u2 = u'u0410u0434u0440u0435u0441'
Примечание:
Обратная косая черта не должна быть последним символом в литерале, то есть, «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.
Регулярные выражения
Рассмотренных стандартных возможностей для работы с текстом достаточно далеко не всегда. Например, в методах find() и replace() задается всего одна строка. В реальных задачах такая однозначность встречается довольно редко, чаще требуется найти или заменить строки, отвечающие некоторому шаблону.
Регулярные выражения (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']
Предварительная компиляция шаблона предпочтительнее при его частом использовании, особенно внутри цикла.
Примечание:
Следует заметить, что для задания шаблона использована необработанная строка. В данном примере она не требовалась, но в общем случае лучше записывать строковые литералы именно так, чтобы исключить влияние специальных последовательностей, записываемых через обратную косую черту.
Синтаксис регулярного выражения
Синтаксис регулярных выражений в Python почти такой же, как в Perl, grep и некоторых других инструментах. Часть символов (в основном буквы и цифры) обозначают сами себя. Строка удовлетворяет (соответствует) шаблону, если она входит во множество строк, которые этот шаблон описывает.
Здесь стоит также отметить, что различные операции используют шаблон по–разному. Так, search() ищет первое вхождение строки, удовлетворяющей шаблону, в заданной строке, а match() требует, чтобы строка удовлетворяла шаблону с самого начала.
Символы, имеющие специальное значение в записи регулярных выражений:
Символ Что обозначает в регулярном выражении
".» Любой символ
"^" Начало строки
"$" Конец строки
"*" Повторение фрагмента нуль или более раз (жадное)
«+» Повторение фрагмента один или более раз (жадное)
"?» Предыдущий фрагмент либо присутствует, либо отсутствует
«{m,n}» Повторение предыдущего фрагмента от m до n раз включительно (жадное)
«[…]» Любой символ из набора в скобках. Можно задавать диапазоны символов с идущими подряд кодами, например: a–z
«[^…]» Любой символ не из набора в скобках
"" Обратная косая черта отменяет специальное значение следующего за ней символа
"|" Фрагмент справа или фрагмент слева
"*?» Повторение фрагмента нуль или более раз (не жадное)
«+?» Повторение фрагмента один или более раз (не жадное)
«{m,n}?» Повторение предыдущего фрагмента от m до n раз включительно (не жадное)
Если A и B – регулярные выражения, то их конкатенация AB является новым регулярным выражением, причем конкатенация строк a и b будет удовлетворять AB, если a удовлетворяет A и b удовлетворяет B. Можно считать, что конкатенация – основной способ составления регулярных выражений.
Скобки, описанные ниже, применяются для задания приоритетов и выделения групп (фрагментов текста, которые потом можно получить по номеру или из словаря, и даже сослаться в том же регулярном выражении).
Алгоритм, который сопоставляет строки с регулярным выражением, проверяет соответствие того или иного фрагмента строки регулярному выражению. Например, строка «a» соответствует регулярному выражению «[a–z]», строка «fruit» соответствует «fruit|vegetable», а вот строка «apple» не соответствует шаблону «pineapple».
В таблице ниже вместо регвыр может быть записано регулярное выражение, вместо имя – идентификатор, а флаги будут рассмотрены ниже.
Обозначение Описание
«(регвыр)» Обособляет регулярное выражение в скобках и выделяет группу
«(?:регвыр)» Обособляет регулярное выражение в скобках без выделения группы
«(?=регвыр)» Взгляд вперед: строка должна соответствовать заданному регулярному выражению, но дальнейшее сопоставление с шаблоном начнется с того же места
«(?!регвыр)» То же, но с отрицанием соответствия
«(?<=регвыр)» Взгляд назад: строка должна соответствовать, если до этого момента соответствует регулярному выражению. Не занимает места в строке, к которой применяется шаблон. Параметр регвыр должен быть фиксированной длины (то есть, без «+» и "*")
«(?
«(?P<имя>регвыр)» Выделяет именованную группу с именем имя
«(?P=имя)» Точно соответствует выделенной ранее именованной группе с именем имя
«(?#регвыр)» Комментарий (игнорируется)
«(?(имя)рв1|рв2)» Если группа с номером или именем имя оказалась определена, результатом будет сопоставление с рв1, иначе – c рв2. Часть |рв2 может отсутствовать
«(?флаг)» Задает флаг для всего данного регулярного выражения. Флаги необходимо задавать в начале шаблона
В таблице ниже описаны специальные последовательности, использующие обратную косую черту:
Последовательность Чему соответствует
"1» – "9» Группа с указанным номером. Группы нумеруются, начиная с 1
"A» Промежуток перед началом всей строки (почти аналогично "^")
"Z» Промежуток перед концом всей строки (почти аналогично "$")
"b» Промежуток между символами перед словом или после него
"B» Наоборот, не соответствует промежутку между символами на границе слова
"d» Цифра. Аналогично «[0–9]»
"s» Любой пробельный символ. Аналогично «[tnrfv]»
"S» Любой непробельный символ. Аналогично «[^tnrfv]»
"w» Любая цифра или буква (зависит от флага LOCALE)
"W» Любой символ, не являющийся цифрой или буквой (зависит от флага LOCALE)
Флаги, используемые с регулярными выражениями:
Листинг
«(?i)», re.I, re.IGNORECASE
Сопоставление проводится без учета регистра букв.
Листинг
«(?L)», re.L, re.LOCALE
Влияет на определение буквы в "w», "W», "b», "B» в зависимости от текущей культурной среды (locale).
Листинг
«(?m)», re.M, re.MULTILINE
Если этот флаг задан, "^" и "$" соответствуют началу и концу любой строки.
Листинг
«(?s)», re.S, re.DOTALL
Если задан, ".» соответствует также и символу конца строки "n».
Листинг
«(?x)», re.X, re.VERBOSE
Если задан, пробельные символы, не экранированные в шаблоне обратной косой чертой, являются незначащими, а все, что расположено после символа "#", – комментарии. Позволяет записывать регулярное выражение в несколько строк для улучшения его читаемости и записи комментариев.
Листинг
«(?u)», re.U, re.UNICODE
В шаблоне и в строке использован Unicode.
Методы объекта–шаблона
В результате успешной компиляции шаблона функцией re.compile() получается шаблон–объект (он именуется SRE_Pattern), который имеет несколько методов, некоторые из них будут рассмотрены. Как обычно, подробности и информация о дополнительных аргументах – в документации по Python.


























