Регулярные выражения / глобусы в списках токенов вместо строк - PullRequest
0 голосов
/ 09 декабря 2018

Итак, у меня есть список токенов, который мы можем представить как список строк для простоты:

["hello", "world", "this", "is", "some", "interesting", "input"]

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

Так что, если у меня есть шаблон (с воображаемым синтаксисом, где вещи, начинающиеся с $, являютсяименованные подстановочные знаки), например, так:

["hello", "$part1", "some", "$part2"]

Я хочу иметь возможность запустить его на входе выше, увидеть, что он совпадает, и иметь возможность получить ["world", "this", "is"] для $part1 и ["interesting", "input"] для$part2.

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

В настоящее время я использую собственный движок регулярных выражений, следуя статье Russ Cox. на NFA, и это определенно сработает, но это довольно сложно.

Есть ли более простой способ сделать это в Python?

1 Ответ

0 голосов
/ 09 декабря 2018

Давайте предположим, что ваш список токенов:

['a', 'b', 'cx', 'cy']

Вы можете легко отобразить его в строку:

'<0><1><2><3>'

Тогда у вас будет такой шаблон:

['a', '<token>*', 'c.*']

Вы можете отобразить шаблон в регулярное выражение:

'<0>(.*)<(2|3)>'

2|3 можно найти с помощью '|'.join(str(i) for i, token in enumerate(tokens) if re.match('c.*', token)).(Или с более быстрым индексированием / кэшированием в зависимости от ваших потребностей.)

Тогда просто используйте любые функции для регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...