Вводная информация о регулярных выражениях

Регулярные выражения представляют собой формулы для создания поисковых запросов, позволяющих находить и заменять символы в строковых или текстовых данных. Выражения называют регулярными потому, что синтаксис многих формальных языков программирования допускает их использование. Поэтому, освоив основные принципы составления регулярных выражений, вы сможете использовать их в разных языках программирования. PolyAnalyst поддерживает регулярные выражения языка Perl. Если вы имеете представление и опыт использования регулярных выражений, вы можете пропустить данный раздел руководства. Ниже описываются лишь базовые принципы составления регулярных выражений и их использования в системе PolyAnalyst. Приведенная здесь информация не является исчерпывающей. За дополнительной информацией обратитесь к любому онлайн-ресурсу.

В PolyAnalyst регулярные выражения используются, в основном, для решения трех следующих задач:

  • Извлечение сущностей

  • Замена цепочек символов

  • Разделение документов

Извлечение сущностей

Извлечение сущностей - процесс извлечения атрибутов из неструктурированного текста. Это одна из операций по структуризации неструктурированных данных, в ходе которой из текстовых значений извлекаются отдельные категориальные и числовые атрибуты. Например, в нашем проекте мы будем использовать регулярные выражения для того, чтобы извлечь скорость движения транспортных средств в момент ДТП. Регулярные выражения - это не единственное средство извлечения сущностей в системе PolyAnalyst. Еще один часто используемый инструмент - XPDL.

Следует отметить, что регулярные выражения больше подходят для извлечения сущностей из полуструктурированного текста или текста, в котором встречаются ожидаемые/прогнозируемые шаблоны. Язык XPDL удобнее использовать для извлечения нечетких или словарных сущностей. Например, шаблон для обозначения скорости транспортного средства вполне можно спрогнозировать и представить в виде нескольких простых последовательностей символов. Обычно такой шаблон выглядит следующим образом: Число + (miles per hour или MPH).

Сравните это, например, с задачей по извлечению имени водителя транспортного средства. Существуют тысячи вариантов имен, и для их извлечения могут понадобиться тысячи регулярных выражений. Удобнее будет использовать словарь наиболее распространенных имен при составлении запроса, а это может быть сделано с помощью XPDL.

Синтаксис регулярных выражений

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

Буквенные символы

Буквенные символы находят буквы в той последовательности, в которой они присутствуют в запросе.

Запрос: MPH

Пример: UPON BEING REAR ENDED @ 65 MPH, BOTH FRONT DRIVER AND PASSENGER SEAT COLLAPSED. PLEASE DESCRIBE DETAILS. *AK

Специальные символы

Специальные символы имеют дополнительное значение наряду с буквальным. Именно такие символы составляют основу регулярных выражений и вызывают основные трудности в их использовании. Знание таких символов значительно облегчит вашу работу в PolyAnalyst.

Список специальных символов

  • \ (обратный слеш)

  • ^ (карет, или знак вставки)

  • $ (знак доллара)

  • . (точка)

  • | (вертикальная линия)

  • ? (вопросительный знак)

  • * (астериск или звезда Клини)

  • + (плюс или плюс Клини)

  • () (круглые скобки)

  • [] (квадратные скобки)

  • {} (фигурные скобки)

Обратный слеш используется для обозначения метасимволов и буквальных версий специальных символов.

Примеры:

\s обозначает пробел
\d обозначает число 0-9
\n обозначает новую строку
\? обозначает вопросительный знак
\\ обозначает обратный слеш

Запрос: \d\d\sMPH

Данный запрос находит число, за которым следует другое число, затем пробел, затем комбинация букв "MPH". Сочетание "65 MPH" отвечает условиям запроса.

Пример: UPON BEING REAR ENDED @ 65 MPH, BOTH FRONT DRIVER AND PASSENGER SEAT COLLAPSED. PLEASE DESCRIBE DETAILS. *AK

Точка

Точка в регулярных выражениях используется как маска. Она находит любой другой символ кроме новой строки \n. Настраивается отдельно в узлах PolyAnalyst.

Звезда Клини или плюс Клини

Астериск (*) или звезда Клини (*) обозначает 0 или более совпадений. Плюс или плюс Клини обозначает 1 или более совпадений.

Запрос: .*

Пример: UPON BEING REAR ENDED @ 65 MPH, BOTH FRONT DRIVER AND PASSENGER SEAT COLLAPSED. PLEASE DESCRIBE DETAILS. *AK

Обратите внимание на то, что запрос .* находит все что угодно, поскольку это очень неконкретный запрос.

Вопросительный знак

Знак вопроса (?) обозначает 0 или 1 совпадение. В результате использования вопросительного знака предшествующий токен в регулярном выражении становится необязательным. В результате запрос colou?r найдет colour и color.

Запрос: \d\d.?MPH

Запрос находит два числа, за которыми стоит один символ, или отсутствует символ, а далее следует комбинация "MPH". Запрос найдет сочетания 65 "MPH" или "65MPH".

Пример: UPON BEING REAR ENDED @ 65 MPH, BOTH FRONT DRIVER AND PASSENGER SEAT COLLAPSED. PLEASE DESCRIBE DETAILS. *AK

Классы символов

Классы символов обозначают разные наборы символов, например, числа или пробелы.

\d обозначает число 0-9 \s обозначает пробел \w обозначает слова (A-z), (0-9), _

Запрос: \d+\s*MPH

Данный запрос находит одно или два числа, за которыми следует любое количество пробелов (или пробел вовсе отсутствует), а за ними - комбинация "MPH". Сочетание "65 MPH" отвечает условиям запроса.

Пример: UPON BEING REAR ENDED @ 65 MPH, BOTH FRONT DRIVER AND PASSENGER SEAT COLLAPSED. PLEASE DESCRIBE DETAILS. *AK

Карет ^ и знак доллара $

Знак ^ находит начало записи.
Знак $ находит конец записи.

Запрос: ^.+\d+

Данный запрос выполняет поиск с начала записи до последнего числа в первой строке. Например, в записи "FLORIDA HWY PATROL REPORT CASE # FHP700-16-18. I-75 IN FL" будет найдено соответствие "FLORIDA HWY PATROL REPORT CASE # FHP700-16-18. I-75".

Пример: UPON BEING REAR ENDED @ 65 MPH, BOTH FRONT DRIVER AND PASSENGER SEAT COLLAPSED. PLEASE DESCRIBE DETAILS. *AK

Запрос: ^.+$

Данный запрос выполняет поиск с начала до конца строки, за исключением пустых строк.

Пример: UPON BEING REAR ENDED @ 65 MPH, BOTH FRONT DRIVER AND PASSENGER SEAT COLLAPSED. PLEASE DESCRIBE DETAILS. *AK

Классы символов []

Находит любые символы внутри скобок.

[aeiou] находит любую гласную букву
[A-Z] находит все заглавные буквы
[A-z] находит любые буквы
[0-9] находит любое число, аналогично \d

Отрицание классов символов (^)

Карет (^) также может использоваться для отрицания класса символов, буквально означает "все, кроме". Запрос [^\d] находит все, кроме числа.

Фигурные скобки {}*

{} означает повторяющиеся совпадения.
\d{3} находит 3-значные числа: 123, 456 и др.
{x,y} находит повторяющиеся цепочки символов от x до y.
\d{1,3} находит 1-, 2- и 3-значные числа 5, 22, 346, 17 и др.

Круглые скобки () и вертикальная линия |

Круглые скобки () обозначают группу.
Вертикальная линия | означает функцию OR (или) в группе.

Непечатные символы

\n находит новую строку.
\t находит знак табуляции.
\r находит символ возврата каретки.

Составной запрос

Запрос \d+\s*(MPH|miles\sper\shour) находит @ 65 MPH или 17 miles per hour.