我正在尝试解析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
编译。
答案 0 :(得分:4)
如何匹配第一行,这是非常一致的?
'commit [0-9a-f]{40}'
答案 1 :(得分:3)
让我们想象一下:
你的正则表达式在比赛结束时需要两个换行符,并且只有一个换行符
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)
然后你可以将提交存储在数组中,然后你可以解析/做任何你喜欢的事情。