如何用Python的re模块分割Git日志为独立提交条目?
用Python的re模块分割Git日志字符串
需求是将给定的Git日志字符串分割为单个提交条目组成的数组,每个条目包含完整的提交信息(commit哈希、作者、日期、提交消息)。
解决方案
使用re.findall结合正则表达式直接提取每个提交块,核心正则模式利用提交的起始特征和非贪婪匹配实现精准分割:
import re git_log = """commit 8e018dbcdbff15c3fc9ef4460b4214f47f71ddf6 Author: ISAAC.NEWTON <ISAAC.NEWTON@GOOGLE.COM> Date: Fri Apr 28 18:58:00 2023 +0800 new cat commit 9274b33435238122c8d6d389e73266f6a3e68745 Author: ISAAC.NEWTON <ISAAC.NEWTON@GOOGLE.COM> Date: Wed Apr 19 11:04:04 2023 +0800 meow commit 4f113912741f753c75a44f18790ff5903e910fad Author: ISAAC.NEWTON <ISAAC.NEWTON@GOOGLE.COM> Date: Fri Apr 14 17:55:55 2023 +0800 Add test files commit 9274b33435238122c8d6d389e73266f6a3e68745 Author: ISAAC.NEWTON <ISAAC.NEWTON@GOOGLE.COM> Date: Wed Apr 19 11:04:04 2023 +0800 Second commit test commit 9274b33435238122c8d6d389e73266f6a3e68745 Author: ISAAC.NEWTON <ISAAC.NEWTON@GOOGLE.COM> Date: Wed Apr 19 11:04:04 2023 +0800 First commit """ # 提取所有提交块 commits = re.findall(r'(?s)^commit .*?(?=^commit |\Z)', git_log, re.MULTILINE) # 如需和示例格式完全一致(每个元素开头带换行),执行以下转换 commits = ['\n' + commit for commit in commits] # 输出结果 print(commits)
正则模式说明
(?s):开启DOTALL模式,让.可以匹配换行符,确保覆盖提交的多行内容^commit:匹配行首的commit,作为每个提交块的起始标记.*?:非贪婪匹配任意字符,避免跨提交块匹配(?=^commit |\Z):正向预查,匹配到下一个行首的commit或者字符串结尾时停止,确保分割边界准确
该模式具备通用性,即使提交消息是多行内容,也能正确提取完整的提交块。
内容的提问来源于stack exchange,提问作者NEET
相关产品推荐
相关产品推荐

