3

私は非常に単純かもしれない何かに行き詰まっていますが、解決策が見つかりません。私は数日前から Python を使用しており、正規表現を使用してファイルの一部を取得する必要があります。

a の結果をgit log -pファイルに入れましたが、いくつかの情報を抽出したいと思います。抽出できないのはコメントブロックだけです。

このブロックは、日付行 AND (差分行 OR リストの末尾) の間にあります。

...
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で始まると、リスト(またはファイル)の終わりになると停止します」。

GitPythonPS私はPython 3.xに取り組んでおり、スクリプトをほぼ完成させたので、 (2.xでのみ機能する)特定のツールを使用したくありません

4

3 に答える 3

1

これを行う1つの方法は次のとおりです。

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

いくつかのメモ:

  • 日付変更線の長さを気にする必要はないと思います。
  • 気になる部分をキャッチ。これには 2 つの意味があります。(1) 日付行を無視するには、最初の改行まですべてを (貪欲に) 消費します。(2) 先読みアサーションは必要ありません。非キャプチャ グループ(?:...)は問題なく動作します。
  • キャプチャされたワイルドカードも非貪欲にすることはおそらく良い考えです: .+?.
  • を使用して、正規表現で文字列の末尾を示すことができます\Z。したがって、非キャプチャ グループとは、(a) "diff " で始まる行、または (b) 文字列の末尾を意味します。
  • 正規表現機能の詳細については、優れたPython ドキュメントを参照してください。
于 2013-07-03T14:18:08.753 に答える
0

これを試してください:

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

これにより、すべてのログ エントリがここでレイアウトした同じパターンに従うと仮定して、コメント エントリのリストが返されます。

于 2013-07-03T14:35:13.823 に答える
0

日付の長さは変わる可能性がありますが、必ず改行で終了します。なぜ文字数を制限する必要があるのでしょうか?

{32,33}とにかく、範囲をキャプチャするようなことができるはずです。

于 2013-07-03T14:14:33.220 に答える