Я пишу скрипт для удаления тегов 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
Вы также можете прокомментировать сценарий, если вы зарегистрируетесь для учетной записи.
благодаря
>>> 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 или более) для 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'
Это хороший вариант использования для any
:
for line in logfile:
if any(line.lower().startswith(prefix) for prefix in prefixes):
print line