Вводная информация о регулярных выражениях
Регулярные выражения представляют собой формулы для создания поисковых запросов, позволяющих находить и заменять символы в строковых или текстовых данных. Выражения называют регулярными потому, что синтаксис многих формальных языков программирования допускает их использование. Поэтому, освоив основные принципы составления регулярных выражений, вы сможете использовать их в разных языках программирования. 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 (или) в группе.