gpt4 book ai didi

python - 从 SVN 日志中过滤 以仅获取票号

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:04 25 4
gpt4 key购买 nike

我正在使用 python 将 SVN 的 XML 日志转换为 CSV...

#!/usr/bin/env python

import csv
import subprocess
import sys
import xml.etree.cElementTree as etree

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:],
stdout=subprocess.PIPE).communicate()[0]
log_xml = etree.XML(log_text)

csv_writer = csv.writer(sys.stdout)

for child in log_xml.getchildren():
csv_writer.writerow([
child.attrib['revision'],
child.findtext('date'),
child.findtext('author').encode('utf-8'),
child.findtext('msg').encode('utf-8'),
])

它会给出输出,例如......

2022,2013-01-02T06:11:40.500850Z,dave.d@email.com,"Ticket 16057735 - Blah "
2023,2013-01-02T06:43:22.247709Z,john.c@email.com,Ticket:16060718 Blah Blah
2027,2013-01-02T07:43:00.326583Z,dave.d@email.com,Ticket 16060936 - Blah Blah

但我想过滤/解析 <msg>创建 .csv 输出时仅选取票号。

任何替代方案(例如使用 perl)都不是问题。

更新:有任何方法可以跳过评论中没有 Ticket #### 的修订日志 ( <msg> )

最佳答案

这是一个简单的解决方案:查找“Ticket”一词后的第一个数字:

if ($line =~ /Ticket\D+(\d+)/)
{
$ticket_number = $1;
}

使用 Perl 语法,但在 Python 中也应该很容易。

这里是 Python 版本的尝试(注意,我不是 Python 程序员):

matchObj = re.match( r'Ticket\D+(\d+)', child.findtext('msg').encode('utf-8'))

if matchObj:
print matchObj.group(1)

正则表达式 Ticket\D+(\d+) 匹配单词 Ticket,然后是一个或多个非数字字符 (\D+),然后是一个或多个数字(\d+)。括号捕获第一个匹配组中模式的封闭部分。

如果您希望匹配更具体,可以使用 (\d{8}) 来确保票号为八位数字。

更新:这两种解决方案都使用 if 语句来指示模式匹配。您只需跳过不匹配的行即可跳过没有票号的行。

关于python - 从 SVN 日志中过滤 <msg> 以仅获取票号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15221557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com