Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用regex从git日志获取注释块_Python_Regex_Python 3.x - Fatal编程技术网

Python 使用regex从git日志获取注释块

Python 使用regex从git日志获取注释块,python,regex,python-3.x,Python,Regex,Python 3.x,我被一些可能很简单的问题困住了,但我找不到解决办法。我从几天前开始使用Python,我需要使用正则表达式来获取文件的一部分 我将一个git log-p的结果放入一个文件中,现在我想提取一些信息。我唯一无法提取的是注释块 此块介于:日期行和(差异行或列表末尾)之间 所以我试着这样做: commentBlock = re.compile("(?<=Date:.{32}\n\n).+(?=|\n\ndiff)", re.M|re.DOTALL) findCommentBlock = re.fi

我被一些可能很简单的问题困住了,但我找不到解决办法。我从几天前开始使用Python,我需要使用正则表达式来获取文件的一部分

我将一个
git log-p
的结果放入一个文件中,现在我想提取一些信息。我唯一无法提取的是注释块

此块介于:日期行和(差异行或列表末尾)之间


所以我试着这样做:

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.

commentBlock=re.compile((?虽然日期的长度可能会改变,但它肯定会以新行结尾,所以为什么要限制字符数


无论如何,您应该能够执行类似于
{32,33}
的操作来捕获范围。

以下是一种方法:

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

  • 我认为你不必担心日期行的长度
  • 捕获您关心的部分。这有两个含义。(1)要忽略日期行,只需(非贪婪地)使用第一行换行符中的所有内容。(2)您不需要前瞻性断言;非捕获组
    (?:…)
    就可以了
  • 让捕获的通配符也不贪婪可能是个好主意:
    +?
  • 可以用
    \Z
    指示正则表达式中字符串的结尾。因此,非捕获组表示:(a)以“diff”开头的行或(b)字符串的结尾
  • 有关正则表达式特性的更多详细信息,请参阅
试试看:

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

假设所有日志条目都遵循您在此处列出的相同模式,这将返回一个注释条目列表。

最终效果非常好。如何更改代码以仅提取注释块?我不想获取日期行。谢谢您的注释!:DGreat,谢谢!我仍然有一个问题。我有以下问题:
('Date:Wed Jul 3 22:32:36 2013+0200\n\n我的评论栏,'my comment block')
。我怎么才能得到第二部分?(如果我清楚就不知道)的确,我的错!非常感谢FMc:Dyou关于长度的说法。使用FMc解决方案,当我写
^Date:.{32,33}\n\n.+?(?=^diff |\Z)时它不起作用
对不起,我仍然对正则表达式很困惑
rgx = re.compile(r'^Date: .+?\n+(.+?)(?:^diff |\Z)', re.MULTILINE | re.DOTALL)
comments = rgx.findall(txt)
re.findall('Date:.+?\n\s*(.+?)\s*(?:diff|$)', text, re.S)