0

我正在尝试解析由git log --numstat. 它的格式是

commit 1234567890123456789012345678901234567890
Author: Joseph Shabadoo
Date: Sun Apr 21 14:34:36 2013 +0300

    fix the thing that was broken

4   0   foo.py
13  7   bar.py

commit aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd
Author: Donald Dont
Date: Fri Apr 19 21:15:00 2012 +0300

    do some stuff

15  6   foo.py

... etc

我将它存储在一个文件中,我想将其拆分为提交以便于解析。我正在使用re.split(),但似乎找不到适合该工作的正则表达式。我会认为使用

re.split('.*?\n\n.*?\n\n.*?\n\n', myfile.read())

会工作,但我把所有的第一次提交和第二次提交的前两行都放在一起(commit aaaaa...Author: ...)。这尤其令人困惑,因为在该行之后没有两个连续的换行符Author:。什么正则表达式可以将其拆分?

编辑:.默认情况下显然不匹配换行符。re 需要用 flag 编译re.DOTALL

4

3 回答 3

4

只匹配第一行怎么样,这是相当一致的?

'commit [0-9a-f]{40}'
于 2013-04-21T08:30:38.117 回答
3

让我们形象化它:

正则表达式好友截图

您的正则表达式在匹配结束时需要两个换行符,并且在该行之后只有一个

4   0   foo.py
于 2013-04-21T10:38:44.733 回答
1

您可以遍历这些行,将行与commit. 然后,您可以将当前提交的所有行存储在一个数组中。

allCommits = []
currentCommitLines = []
for line in lines:
    if re.match(r'^commit [0-9a-f]{40}') and currentCommitLines:
        allCommits.append(currentCommitLines)
        currentCommitLines = []
     currentCommitLines.append(line)

然后你会将提交存储在数组中,你可以稍后解析/做任何你想做的事情。

于 2013-04-21T08:36:57.230 回答