Что такое регулярное выражение для перехвата всех строк нижнего колонтитула git commit в выводе журнала git?

1

Я пишу скрипт для удаления тегов git commit (например, Signed-off-by:, Reviewed-by: :) из каждого сообщения git commit. В настоящее время скрипт находится на питоне. Прямо сейчас у меня очень простая re.match("Signed-off-by:", line). Но я думаю, что должно быть более элегантное решение, использующее регулярное выражение.

Я предполагаю, что нижний колонтитул начнется с [более слов, разделяющих -]: например

Bug:, Issue:, Reviewed-by:, Tested-by:, Ack-by:, Suggested-by:, Signed-off-by:

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

Фактический скрипт python находится здесь https://gerit-review.googlesource.com/#/c/33213/2/tools/gitlog2asciidoc.py

Вы также можете прокомментировать сценарий, если вы зарегистрируетесь для учетной записи.

благодаря

  • 0
    Почему вы должны сделать это, чтобы начать с? Вы знаете, что можете настроить вывод команды "git log" для начала? Смотрите "git help log" для форматирования строк. Пример: git log --pretty = format: "Автором% h был% an,% ar% nТитул был >>% s <<% n"
Теги:
formatting

3 ответа

1
Лучший ответ
>>> def match_commit(s):
    r = re.compile(r'((\w+*)+\w+:)')
    return re.match(r, s) is not None

>>> match_commit("Signed-off-by:")
True
>>> match_commit("Signed-off+by:")
False
>>> match_commit("Signed--by:")
False
>>> match_commit("Bug:")
True
>>> match_commit("Bug-:")
False

Первая группа (\w+-)* фиксирует 0 до любых повторений паттернов "слово +" - "", последний из них \w+: ищет последнее слово + ':'.

  • 0
    Спасибо, но эта логика не поддерживает случай, когда в строке нижнего колонтитула есть одно слово. (например, ошибка: проблема :). Не могли бы вы обновить регулярное выражение для обработки дела?
  • 1
    О, ты прав! Я просто должен использовать repetitor * (0 или более повторений) вместо + (1 или более) для 1-й группы - см. Мое редактирование.
1

Хотя подход с регулярным выражением был бы хорош, и с помощью всего лишь флага вы можете игнорировать случай, я думаю, что в этом случае вы можете просто использовать startswith для достижения той же цели:

prefixes = ['bug:', 'issue:', 'reviewed-by:', 'tested-by:',
            'ack-by:', 'suggested-by:', 'signed-off-by:']
...
lower_line = line.lower()
for prefix in prefixes:
    if lower_line.startswith(prefix):
        print 'prefix matched:', prefix
else:
    print 'no match found'
  • 0
    Спасибо, но это значит, что мне нужно менять код каждый раз, когда я хочу добавить нижний колонтитул.
  • 0
    Вы можете получить список префиксов из файла конфигурации, если хотите, чтобы вам не нужно было менять код.
0

Это хороший вариант использования для any:

for line in logfile:
    if any(line.lower().startswith(prefix) for prefix in prefixes):
        print line

Ещё вопросы

Сообщество Overcoder
Наверх
Меню