Pull to refresh

Регулярные выражения. Сборник рецептов

Reading time8 min
Views7.3K
Мы каждый день работаем с текстом, решая разные задачи. Проверяем текст на правильность ввода некоторых данных, ищем, заменяем некоторые значения, выделем некоторые данные из текста. Порой объём этих данных значительно возрастает и справиться с такими объёмами текстовой информации за актуальный промежуток времени не получается.

Нам на помощь прийдут регулярные выражение. Этот мощный инструмент многие специалисты уже давно используют очень успешно. Я говорю не только о разработчиках программного обеспечения, но и о людях других профессий, которым приходится работать с текстом (редакторы, маркетологи, копирайтеры).

Сегодня я хотел бы познакомить вас с книгой Яна Гойвертса и Стивена Левитана «Регулярные выражения. Сборник рецептов», которая поможет вам понять как работать с регулярными выражениями.

Давайте разберёмся что же за такой полезный инструмент эти регулярные выражения.

Регуля́рные выраже́ния (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэ́кспы или ре́гексы) — система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи образцов для поиска. Образец (англ. pattern), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской».

Википедия

Немного трудно понять из описания что это такое, но постараюсь объяснить простым языком. У нас есть текст, который нужно обработать и есть требование как нам нужно его обработать. По требованию мы строим некоторый шаблон. Передаём наш шаблон и текст программе, которая сделает разбор. Так намного проще?

О книге


В книге показаны решения, основанные на использовании регулярных выражений, применённые к широкому кругу практических задач, связанных с обработкой текста, возникающих в различных приложениях.

Книга как бы разделена на две больших логические части. Первая часть посвещена теории регулярных выражений, синтаксису и описанию разных диалектов.
    Глава 1. Введение в регулярные выражения;
    Глава 2. Основные навыки владения регулярными выражениями;
    Глава 3. Программирование с применением регулярных выражений.

Вторая часть посвещена решению разных задач, которые могут возникнуть.
    Глава 4. Проверка и форматирование;
    Глава 5. Слова, строки и специальные символы;
    Глава 6. Числа;
    Глава 7. URL, пути и адреса в Интернете;
    Глава 8. Разметка и обмен данными.

Книга читается очень легко и понятна будет даже тем людям, которые никогда не имели навыков программирования. Все примеры построены по принципу — ставится задача, решается и после этого разбирается более подробно.

Об авторах


Ян Гойвертс является основателем компании Just Great Software, где занимается проектированием и разработкой некоторых популярнейших программных продуктов для работы с регулярными выражениями. Он является автором приложения RegexBuddy, единственного в мире редактора регулярных выражений, имитирующего особенности 15 диалектов, и PowerGREP, самого мощного инструмента grep для Microsoft Windows.

Стивен Левитан является ведущим экспертом по регулярным выражениям в JavaScript. Он ведет популярный блог, посвященный регулярным выражениям, по адресу http://blog.stevenlevithan.com. Расширение знаний о диалектах регулярных выражений и библиотеках поддержки было для него одним из увлечений на протяжении нескольких последних лет.

Пример


Я хотел бы остановиться на одном примере в книге. В нём рассмотрена проверка правильности ввода ISBN. Его я выбрал по некоторым причинам — он прост, он достаточно нагляден и по случайности в пример, который приведён в книге, написаный на Python закралась ошибка. Я решил переписать этот пример.

Для начала давайте убедимся, что страшный шаблон ^(?:ISBN(?:-1[03])?:? )?(?=[-0-9 ]{17}$|[-0-9X ]{13}$|[0-9X]{10}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?(?:[0-9]+[- ]?){2}[0-9X]$ действительно работает. Я проведу проверку в текстовом редакторе Espresso.
Espresso regexp
Редактор нашёл одно совпадение. Шаблон правильный и мы можем приступить к написанию программы на Python (я использовал версию 2.6.1).

  1. # -*- coding: utf-8 -*-
  2. # file: isbn_check.py
  3.  
  4. import re
  5. import sys
  6.  
  7. # регулярное выражение проверяте соответствие формату ISBN-10 или ISBN-13
  8. regex = re.compile("^(?:ISBN(?:-1[03])?:? )?(?=[-0-9 ]{17}$|[-0-9X ]{13}$|[0-9X]{10}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?(?:[0-9]+[- ]?){2}[0-9X]$")
  9.  
  10. subject = sys.argv[1]
  11.  
  12. if regex.search(subject):
  13.     # Удаляем символы, не имеющие отношения к ISBN
  14.     cbuf = re.sub("[^0-9X]""", subject)
  15.  
  16.     # Создаём массив
  17.     chars = list()
  18.  
  19.     # Разбиваем номер на части и добавляем в массив
  20.     for item in cbuf[:]:
  21.         chars.append(item)
  22.  
  23.     # Перемещаем последнюю цифру из массива chars в переменную last
  24.     last = chars.pop()
  25.  
  26.     if len(chars) == 9:
  27.         # Вычисляем конторольную цифру ISBN-10
  28.         val = sum((x + 2) * int(y) for x, y in enumerate(reversed(chars)))
  29.  
  30.         check = 11 - (val % 11)
  31.  
  32.         if check == 10:
  33.             check = "X"
  34.         elif check == 11:
  35.             check = "0"
  36.     else:
  37.         # Вычисляем конторольную цифру ISBN-13
  38.         val = sum((% 2 * 2 + 1) * int(y) for x, y in enumerate(chars))
  39.  
  40.         check = 10 - (val % 10)
  41.  
  42.         if check == 10:
  43.             check = "0"
  44.  
  45.     if (str(check) == last):
  46.         print u"Корректный ISBN"
  47.     else:
  48.         print u"Некорректная контрольная цифра ISBN"
  49. else:
  50.     print u"Некорректный ISBN"

Проверим работу нашей программы, которая проверят правильность ISBN.
ISBN check

Программа работает корректно, а подробное обсуждение того, как это работает и некоторую справку можно прочитать в книге (§4.13). Хочу лишь добавить, что каждый рецепт, который дан в книге, подробно разбирается. Разбирается алгоритм и сам шаблон. Как пример возьмём рассмотрение этого шаблона в книге:

^                   # Проверка совпадения с началом строки
(?:                 # Группировка, но нисходящая
    ISBN            #   Соответствует фрагменту ISBN
    (?:-1[03])?     #   Необязательное совпадение с фрагментом "-10" или "-13"
    :?              #   Необязательное совпадение с фрагментом ":"
    \               #   Соответствует фрагменту пробела (экранирован)
)?                  # Повторить группу ноль или один раз
(?=                 # Опережающая проверка возможности следующих совпадений
    [-0-9 ]{17}$    #   Соответствует 17 дефисам, цифрам или пробелам
    |               #   за которыми следует конец строки. Или
    [-0-9X ]{13}$   #   Соответствует 13 дефисам, цифрам, "X" или пробелам
    |               #   за которыми следует конец строки. Или
    [0-9X]{10}$     #   Соответствует 10 цифрам или "X", с последующем концом строки
)                   # Конец позитивной опережающей проверки
(?:                 # Группировка, но нисходящая
    97[89]          #   Соответствует фрагменту "978" или "979"
    [-\ ]?          #   Необязательное совпадение с "-" или пробелом (экранирован)
)?                  # Повторить группу ноль и один раз
[0-9]{1,5}          # Соответствует от 1 до 5 цифр
[-\ ]?              # Необязательное совпадение с "-" или пробелом (экранирован)
(?:                 # Группировка, но нисходящая
    [0-9]+          #   Цифра, которая соответствует 1 или более раз
    [-\ ]?          #   Необязательное совпадение с "-" или пробелом (экранирован)
){2}                # Повторить группу точно 2 раза
[0-9X]              # Соответствует цифре или "X"
$                   # Проверка с концом строки


Заключение


coverРегулярные выражения — это очень мощный инструмент, который может упростить решения многих задач. Данная книга поможет в полной мере овладеть регулярными выражениями.

«Регулярные выражения. Сборник рецептов»
Ян Гойвертс и Стивен Левитан
Издательство «Символ-Плюс», 2010, 608 страниц
ISBN 978-5-93286-181-3

Спасибо за предоставленную книгу издательству «Cимвол-Плюс». В интернет-магазине издательства книгу можно приобрести.
Tags:
Hubs:
+30
Comments49

Articles