【问题标题】:Use regex to get comment block from a git log使用正则表达式从 git 日志中获取注释块
【发布时间】:2013-07-03 14:10:28
【问题描述】:

我遇到了一些可能非常简单的问题,但我找不到解决方案。几天以来我一直在使用 Python,我需要使用正则表达式来获取文件的一部分。

我将git log -p 的结果放入一个文件中,现在我想提取一些信息。我唯一无法提取的是评论块。

此块位于:日期线与(差异线或列表末尾)之间。

...
Date:   Wed Jul 3 22:32:36 2013 +0200

    Here is the comment
    of a commit

    and I have to
    extract it

diff --git a/dir.c b/dir.c
...

...
Date:   Wed Jul 3 22:32:36 2013 +0200

    Here is the comment
    of a commit

    and I have to
    extract it

所以我尝试这样做:

commentBlock = re.compile("(?<=Date:.{32}\n\n).+(?=|\n\ndiff)", re.M|re.DOTALL)
findCommentBlock = re.findall(commentBlock,commitBlock[i]) # I've splited my git log everytime I find a "commit" line.

问题是:

  • 日期线的长度可以改变。如果日期在 1 日到 9 日之间,则可以是 Date:.{32};如果日期是 2 个数字,则可以是 Date:.{33}
  • 我不知道怎么说:“当一行以diff 开头或当它是列表(或文件)的末尾时,注释块停止”。

附:我正在使用 Python 3.x,我几乎完成了我的脚本,所以我真的不想使用像 GitPython 这样的特定工具(仅适用于 2.x)

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    这是一种方法:

    rgx = re.compile(r'^Date: .+?\n+(.+?)(?:^diff |\Z)', re.MULTILINE | re.DOTALL)
    comments = rgx.findall(txt)
    

    一些注意事项:

    • 我认为您不必担心日期变更线的长度。
    • 捕获您关心的部分。这有两个含义。 (1) 要忽略日期行,只需通过第一个换行符(非贪婪地)消耗所有内容。 (2) 你不需要前瞻断言;非捕获组(?:...) 可以正常工作。
    • 将捕获的通配符也设为非贪婪可能是个好主意:.+?
    • 您可以在正则表达式中使用\Z 指示字符串的结尾。因此,非捕获组意味着:(a) 以“diff”开头的行或 (b) 字符串结尾。
    • 有关正则表达式功能的更多详细信息,请参阅优秀的Python docs

    【讨论】:

    • 它完美地工作到最后。如何更改您的代码以仅提取注释块?我不想得到日期线。谢谢你的笔记! :D
    • 太好了,谢谢!不过我还是有问题。我有这个:('Date: Wed Jul 3 22:32:36 2013 +0200\n\n my comment block', ' my comment block ')。我怎样才能得到第二部分? (不知道我是否清楚)
    • 确实,我的错!非常感谢FMc :D
    【解决方案2】:

    虽然日期的长度可能会发生变化,但它肯定会以换行符结束,那么为什么要限制字符数呢?

    无论如何,您应该能够执行{32,33} 之类的操作来捕获范围。

    【讨论】:

    • 你说得对。使用FMc解决方案,我写^Date:.{32,33}\n\n.+?(?=^diff |\Z)时不起作用,对不起,我对正则表达式仍然很困惑
    【解决方案3】:

    试试这个:

    re.findall('Date:.+?\n\s*(.+?)\s*(?:diff|$)', text, re.S)
    

    这应该返回一个评论条目列表,假设所有日志条目都遵循您在此处列出的相同模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2014-07-26
      • 1970-01-01
      • 2016-01-16
      • 2011-05-11
      相关资源
      最近更新 更多