WedX - журнал о программировании и компьютерных науках

Сопоставление выражений в строках

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

(word1 AND word2) OR (word3) 

Я не могу жестко закодировать их (потому что они могут быть изменены в базе данных), поэтому я подумал о программном преобразовании этих выражений в шаблоны Regex.

Кто-нибудь уже выполнял такую ​​задачу или имеет представление о том, как это сделать лучше всего? Я не совсем уверен в том, как работать с более сложными выражениями, как их разбирать и так далее.

Изменить: я использую С# в VisualStudio/.NET.

Данные в основном представляют собой пути к каталогам, клиент хочет организовать свои документы, поэтому строка, которая у меня есть, представляет собой пути, выражения в БД могут выглядеть так:

(office OR headquarter) AND (official OR confidential)

Поэтому, если путь к каталогу файла содержит офисный и конфиденциальный, он должен совпадать.

Надеюсь, это прояснит ситуацию.

РЕДАКТИРОВАТЬ2:

Вот несколько фиктивных примеров:

Пути могут выглядеть так:

c:\documents\official\johnmeyer\court\out\letter.doc
c:\documents\internal\appointments\court\in\september.doc
c:\documents\official\stevemiller\meeting\in\letter.doc

И такие выражения:

(meyer or miller) AND (court OR jail)

Таким образом, это выражение будет соответствовать 1-му пути/файлу, но не 2-му и 3-му.

05.11.2012

  • на каком языке, как вы собираетесь использовать выражения? 05.11.2012
  • Можете ли вы предоставить несколько строк фактических данных и то, что вы хотите, чтобы шаблон регулярного выражения соответствовал? 05.11.2012
  • Можете ли вы показать нам список примеров, которые должны совпадать, и другой список, который не должен совпадать? 05.11.2012
  • К сожалению нет, список содержит конфиденциальные вещи. 05.11.2012
  • Чувак, нам нужны не твои конфиденциальные вещи, а фиктивные примеры, которые ты можешь создать, чтобы облегчить понимание твоего вопроса... 05.11.2012
  • См. EDIT2, я надеюсь, что это имеет смысл. 06.11.2012

Ответы:


1

Нет ответа, но хороший намек:

Выражения, которые у вас есть, представляют собой настоящие деревья, построенные с помощью круглых скобок. Вам нужна стековая машина для анализа текста в (бинарную) древовидную структуру, где каждый узел представляет собой элемент AND или OR, а листья — это слова. После этого вы можете просто построить свое регулярное выражение на любом языке, который вам нужен, пройдясь по дереву с помощью поиска в глубину и добавляя данные префикса и суффикса по мере необходимости до/после чтения поддерева.

Рассмотрим abstract class TreeNode с методом GenerateExpression(StringBuilder result). Каждый фактический элемент TreeNode будет либо CombinationTreeNode (со свойством CombinationMode And/Or), либо SearchTextTreeNode (со свойством SearchText).

GenerateExpression(результат StringBuilder) для CombinationTreeNode будет выглядеть примерно так:

result.Append("(");
rightSubTree.GenerateExpression(result);
result.Append(") " + this.CombinationMode.ToString() + " (");
rightSubTree.GenerateExpression(result);
result.Append(")");

GenerateExpression(результат StringBuilder) для SearchTextTreeNode намного проще:

result.Append(this.SearchText);

Конечно, ваш код будет генерировать регулярное выражение вместо входного текста, как это делает мой.

05.11.2012
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: wedx@cp9.ru