簡體   English   中英

Python re.split()行為異常

[英]Python re.split() misbehaving

我正在嘗試解析git log --numstat生成的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需要使用標志re.DOTALL進行編譯。

只匹配非常一致的第一行怎么樣?

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

讓我們對其進行可視化:

RegexBuddy屏幕截圖

您的正則表達式在比賽結束時需要兩行換行,而行后只有一行

4   0   foo.py

您可以遍歷行,使行與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)

然后,您將把提交存儲在數組中,以后可以解析/處理它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM