我设法让我的脚本根据行中的内容打印出一行文字:
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编号
答案 0 :(得分: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'
答案 1 :(得分: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。
答案 2 :(得分:1)
您需要进一步修复解析算法,但只需获取值部分:
>>> from urllib2 import urlparse
>>> urlparse.parse_qs(urlparse.urlparse(s).query)['name'][0]
'1999-0016][Xref'
一旦你修复了这个位CVE = list_of_line[4:5]
,上面的内容就会给你预期的结果。