Несколько регулярных выражений, применяемых в однопроходном режиме с обратными ссылками?

Я пытаюсь написать небольшой инструмент обучения и документации (annotate_tree) в Python, который аннотирует четко определенная структура каталогов проекта.

Чтобы сделать простой пример, все после # # следует добавить в script: <myproject>/ # the project root docs/ # documentation (using Sphinx) build/ # Sphinx-generated output source/ # doc source files (Restructured Text) tests/ # unit tests for py.test __pycache__/ # do not commit to version control

Итак, моя мысль заключалась в том, чтобы собрать структуру каталогов, начиная с пути, заданного пользователем, а затем для каждого , примените словарь Python, который содержит строку регулярного выражения для соответствия имени каталога как ключей, и значения в качестве другой строки, которая должна допускать обратные ссылки на группы в регулярном выражении match (для извлечения частей имен файлов).

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

Я могу придумать следующее решение, но это multi-pass (Привет, мистер Бессон!) с обычными проблемами, связанными с сортировать совпадения по длине (еще не сделано):

#!/usr/bin/env python3

import re

tree = '''<myproject>/
    docs/
        build/
        source/
    tests/
    __pycache__/'''

repls = {
    r'(<myproject>/)' : r'\g<1>  # the project root',
    r'(docs/)'        : r'\g<1>  # documentation (using Sphinx)',
    r'(build/)'       : r'\g<1>  # Sphinx-generated output',
    # ...
    }

for line in tree.splitlines():
    subst = line
    for key, val in repls.items():
        subst = re.sub(key, val, subst);
    print(subst)

qaru.site/info/42434/... - приятное однопроходное решение, но обратные ссылки не работают так легко, потому что этот код уже создает именованные группы для отдельных замещающих элементов словаря.

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