Python re.split()行为不端

时间:2013-04-21 08:25:24

标签: python regex git

我正在尝试解析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.DOTALL编译。

3 个答案:

答案 0 :(得分:4)

如何匹配第一行,这是非常一致的?

'commit [0-9a-f]{40}'

答案 1 :(得分:3)

让我们想象一下:

RegexBuddy screenshot

你的正则表达式在比赛结束时需要两个换行符,并且只有一个换行符

4   0   foo.py

答案 2 :(得分: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)

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