Преобразуйте регулярное выражение в другое - PullRequest
2 голосов
/ 19 октября 2011

Мне нужно написать регулярные выражения для соответствия некоторому токенизируемому тексту, и будет сложнее добавить все \s* и \s+, если количество пробелов незначительно или совсем не требуется.

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

Например:

make_whitespace(regex="foo\.(\w+)\(a\)",delimiters="()[]{},.+-")

должен вернуть

"foo\s*\.\s*(\s*\w+\s*)\(\s*a\s*\)"

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Я добавил пример в документы по регулярным выражениям, чтобы показать, как написать гибкий токенизатор, используя только регулярные выражения: http://docs.python.org/py3k/library/re.html#writing-a-tokenizer

Он показывает, как построить регулярное выражение из частей и как игнорировать пробелы.

В качестве альтернативы, вы можете рассмотреть возможность сделать два прохода над входами.Сначала выполните re.sub , чтобы заменить повторяющиеся пробельные символы (табуляции, новые строки, серии пробелов и т. Д.) Только одним пробелом.После этого регулярные выражения для фактического парсера будут намного проще.

Удачи.

1 голос
/ 05 ноября 2011

Наш Комплект реинжиниринга программного обеспечения DMS может это сделать. Он принимает определения языка как EBNF, создает AST и позволяет применять преобразования источника к источнику к AST, а затем восстанавливать текст из AST.

Вам понадобится EBNF для регулярного выражения, но это легко.

...