从SVN日志中筛选<msg>以仅提取票证编号

2024-09-30 22:14:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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'),
        ])

它将给出输出,例如。。。在

^{pr2}$

但是我想过滤/解析<msg>,以便在创建.csv输出时只提取票证号。在

使用perl等任何替代方法都不是问题。在

更新:跳过注释(<msg>)中没有罚单的修订日志的任何方法


Tags: csvtextimportlogchildstdoutsysmsg
1条回答
网友
1楼 · 发布于 2024-09-30 22:14:11

这里有一个简单的解决方案:查找单词Ticket后面的第一个数字:

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

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

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

^{pr2}$

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

如果您想让匹配更具体,可以使用(\d{8})来确保票号有8位数字。在

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

相关问题 更多 >