3

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

我将 a 的结果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.

问题是:

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

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

4

3 回答 3

1

这是一种方法:

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

几点注意事项:

  • 我认为您不必担心日期线的长度。
  • 捕捉你关心的部分。这有两个含义。(1) 要忽略日期行,只需通过第一个换行符(非贪婪地)消耗所有内容。(2) 你不需要前瞻断言;非捕获组(?:...)将正常工作。
  • 使捕获的通配符也不是贪婪的可能是一个好主意:.+?.
  • 您可以在正则表达式中用\Z. 因此,非捕获组意味着:(a)以“diff”开头的行或(b)字符串的结尾。
  • 更多关于正则表达式特性的细节可以在优秀的Python 文档中找到。
于 2013-07-03T14:18:08.753 回答
0

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

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

于 2013-07-03T14:14:33.220 回答
0

试试这个:

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

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

于 2013-07-03T14:35:13.823 回答