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