Я пытаюсь выяснить, существует ли разумно эффективный способ выполнить поиск в словаре (или хеш, или карта, или как ваш любимый язык вызывает его), где ключи являются регулярными выражениями, и строки выглядят против набора ключей. Например (в синтаксисе Python):
>>> regex_dict = { re.compile(r'foo.') : 12, re.compile(r'^FileN.*$') : 35 }
>>> regex_dict['food']
12
>>> regex_dict['foot in my mouth']
12
>>> regex_dict['FileNotFoundException: file.x does not exist']
35
(Очевидно, что приведенный выше пример не будет работать так, как написано на Python, но это то, что я хотел бы сделать.)
Я могу представить себе наивный способ реализовать это, в котором я перебираю все ключи в словаре и пытаюсь сопоставить прошедшие в них строки, но затем я теряю время поиска O (1) хеш-карте и вместо этого имеет O (n), где n - количество ключей в моем словаре. Это потенциально большое дело, так как я ожидаю, что этот словарь будет очень большим, и мне нужно будет искать его снова и снова (на самом деле мне нужно будет перебирать его для каждой строки, которую я читаю в текстовом файле, и файлы могут иметь размер в сотни мегабайт).
Есть ли способ выполнить это, не прибегая к эффективности O (n)?
В качестве альтернативы, если вы знаете способ выполнения такого поиска в базе данных, это тоже было бы здорово.
(Любой язык программирования хорош - я использую Python, но меня больше интересуют структуры данных и алгоритмы здесь.)
Кто-то указал, что возможно более одного матча, и это абсолютно правильно. В идеале в этой ситуации я хотел бы вернуть список или кортеж, содержащий все совпадения. Я бы согласился на первый матч, хотя.
Я не вижу возможности O (1) в этом сценарии; Я бы согласился на что-то меньшее, чем O (n). Кроме того, базовая структура данных может быть чем угодно, но основное поведение, которое я бы хотел, это то, что я написал выше: поиск строки и возврат значений, соответствующих клавишам регулярных выражений.