Я пытаюсь написать небольшой инструмент обучения и документации (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/... - приятное однопроходное решение, но обратные ссылки не работают так легко, потому что этот код уже создает именованные группы для отдельных замещающих элементов словаря.
Кто-нибудь получил более приятное однопроходное решение, позволяющее обратные ссылки или, возможно, совершенно другой подход?