У меня довольно большой опыт работы с регулярными выражениями, но у меня возникли сложности с текущим приложением, связанным с дизъюнкцией.
Моя ситуация такова: мне нужно разделить адрес на его составные части на основе совпадения регулярного выражения на «элементах идентификатора» адреса - сопоставимым примером на английском языке были бы такие слова, как «состояние»,«дорога» или «бульвар» - ЕСЛИ, например, мы написали это в наших адресах.Представьте, что у нас есть адрес, подобный следующему, где (и этого никогда не будет на английском языке) мы указали тип идентификатора после каждого имени
United States COUNTRY California STATE San Francisco CITY Mission STREET 345 NUMBER
(где слова в CAPSчто я назвал "идентификаторы").
Мы хотим разобрать это в:
United States COUNTRY<br>
California STATE<br>
San Francisco CITY<br>
Mission STREET<br>
245 NUMBER<br>
Хорошо, это, конечно, надумано для английского, но вот подвох: я работаю с китайскими данными, где на самом деле этостиль определения идентификатора происходит постоянно.Пример ниже:
云南-省 ; 丽江-市 ; 古城-区 ; 西安-街 ; 杨春-巷 ;
Yunnan-Province ; LiJiang-City ; GuCheng-District ; Xi'An-Street ; Yangchun-Alley
Это достаточно просто - ленивое сопоставление имен идентификаторов потенциальных кандидатов, разделенных на дизъюнктивный список.
Для Китая следующие объекты "уровня провинции":
省 (Province) ,
自治区 (Autonomous Region) ,
市 (Municipality)
Итак, мое регулярное выражение до сих пор выглядит так:
(.+?(?:(?:省)|(?:自治区)|(?:市)))
У меня есть ряд таких, чтобы учесть разные части адреса.Например, следующий уровень, соответствующий городам:
(.+?(?:(?:地区)|(?:自治州)|(?:市)|(?:盟)))
Таким образом, чтобы соответствовать объекту провинции, за которым следует объект города:
(.+?(?:(?:省)|(?:自治区)|(?:市)))(.+?(?:(?:地区)|(?:自治州)|(?:市)|(?:盟)))
С именованными группами захвата:
(?<Province>.+?(?:(?:省)|(?:自治区)|(?:市)))(?<City>.+?(?:(?:地区)|(?:自治州)|(?:市)|(?:盟)))
Для вышеизложенного это дает:
$+{Province} = 云南省<br>
$+{City} = 丽江市
Это все хорошо и хорошо, и получаетя довольно далекоПроблема, однако, заключается в том, когда я пытаюсь учесть идентификаторы, которые могут быть подстрокой других идентификаторов.Например, обычная организация уровня улицы - «村委会», что означает сельский организационный комитет.В наборе адресов, которые я хотел бы выделить, не на каждом адресе это написано полностью.На самом деле, я нахожу «村委» и просто «村».
Проблема?Если у меня есть чисто дизъюнкция этих элементов, у нас будет следующее:
(?<Street>.+?(?:(?:村委会)|(?:村委)|(?:村)))
Что произойдет, если у вас есть сущность 保定 - 村委会 (Baoding VillageОрганизационный комитет), это ленивое регулярное выражение останавливается на 村 и называет это днем, осиротев для наших бедных 委会, потому что 村 является одним из потенциальных дизъюнктивных элементов.
Представьте себе английский эквивалент, подобный следующему:
(?<Animal>.+?(?:(?:Cat)|(?:Elephant)|(?:CatElephant)|(?:City)))
У нас есть две строки ввода:
1. "Crap Catelephant Crap City", где мы хотели "Crap Catelephant""and" crap city "2." crap catelephant city ", где мы хотели" crap cat "" город-слон "
Ах, решение, вы говорите, состоит в том, чтобы сделать предварительный идентификатор захватом жадным.Но!Существуют объекты с одинаковым идентификатором, которые не находятся на одном уровне.
Взять, к примеру, 市.Это означает просто "город".Но в Китае есть города на уровне округов, провинций и муниципалитетов.Если этот символ встречается в строке дважды, особенно в двух смежных объектах, жадный поиск неверно помечает жадное совпадение как первый объект.Как показано ниже:
广东-省 ; 江门-市 ; 开平-市 ; 三埠-区 石海管-区<br>
Guangdong-province ; Jiangmen-City ; Kaiping-City ; Sanbu-District ; Shihaiguan-District
(Обратите внимание, что, как и выше, это было сегментировано вручную. Необработанные данные будут просто иметь строку связанных символов)
Соответствие для жадного поиска будет
江门市开平市
Это неверно, так как две смежные сущности должны быть разделены на составные части.Когда-то на уровне провинциального города, один город на уровне округа.
Вернуться к исходной точкеи я благодарю вас за то, что вы прочитали это далеко, есть ли способ поставить вес на дизъюнктивных сущностях? Я хотел бы, чтобы регулярное выражение сначала находило самый высокий «взвешенный» идентификатор.村委会 вместо простого 村, например, "католик" вместо просто "кот". В предварительных экспериментах синтаксический анализатор регулярных выражений, по-видимому, работает слева направо в поиске дизъюнктивных совпадений. Это правильное предположение? Должен ли я поставить наиболее часто встречающиеся идентификаторы первыми в дизъюнктивном списке?
Если я потерял кого-либо с деталями, связанными с Китаем, я прошу прощения и, при необходимости, могу уточнить. Пример на самом деле не обязательно должен быть китайским - я думаю, в более общем плане, это вопрос о механизме дизъюнктивного совпадения с регулярным выражением - в каком порядке он предпочитает дизъюнктивные сущности и как он решает, когда «вызывать» день "в контексте ленивого поиска?
В каком-то смысле, есть что-то среднее между ленивыми и жадными поисками? Найти самый маленький бит, который вы можете найти перед самым длинным / самым высоким взвешенным дизъюнктивным объектом? Будьте ленивы, но приложите немного усилий, если можете ради тщательности?
(Кстати, моя философия работы в колледже?)