3

我已经设法让我的脚本根据行中的内容打印出一行文本:

if "cvename" in line:       
    CVE = list_of_line[4:5]     
    print "The CVE number is ", ' '.join(CVE)       
    print " "
    CVEfile.write("CVE-" + str(CVE) + '\n')

打印出来:

['http://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-0016][Xref']

但我想要的只是值'1999-0016'

我假设可以使用正则表达式来执行此操作,但我没有太多使用它们的经验。我注意到的是,我要提取的值总是以年份开头,因为它是 CVE 编号

4

3 回答 3

2

在使用正则表达式之前,请始终尝试使用更具体的方法。你需要解析一个网址吗?使用urlparse.

import urlparse

u = 'http://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-0016'

q = urlparse.urlparse(u).query
values = urlparse.parse_qs(q).get('name')
if values is not None:
    print values[0]
    # prints '1999-0016'
于 2013-03-11T11:52:10.890 回答
1

在这种情况下,您可以使用正则表达式,是的:

re.compile(r'name=(\d{4}-\d{4})')

name=将匹配以两个 4 位数字开头的任何文本。分组允许您提取该数字:

>>> import re
>>> cve_param = re.compile(r'name=(\d{4}-\d{4})')
>>> cve_param.search('http://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-0016][Xref').group(1)
'1999-0016'

我确实注意到通常CVE 编号以文本为前缀CVE-;匹配两种形式的正则表达式是:

re.compile(r'name=(?:CVE-)?(\d{4}-\d{4})')

使用正则表达式可以让您从全文中挑选出这样的 URL。另一方面,如果您使用的是适当的 HTML 解析器,我建议您改为解析组成部分的 URL。

于 2013-03-11T11:47:20.973 回答
1

您需要进一步修复解析算法,但只获取值部分:

>>> from urllib2 import urlparse
>>> urlparse.parse_qs(urlparse.urlparse(s).query)['name'][0]
'1999-0016][Xref'

修复此位CVE = list_of_line[4:5]后,上述内容将为您提供预期的结果。

于 2013-03-11T11:51:58.307 回答