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番号であるため、抽出したい値は常に1年で始まるということです。

4

3 に答える 3

2

正規表現を使用する前に、常により具体的なアプローチを使用するようにしてください。URL を解析する必要がありますか? を使用し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=その後に 2 つの 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 に答える