2016-04-04 12 views
0

私はこれで働いていたので、それがしばらくされていますが、私は私の問題を解決する方法を見つけ出すことはできません。pythonで各パッケージは、正規表現を使ってテキストファイルから提供して何の抽出

私は、このようなhttp://fr.archive.ubuntu.com/ubuntu/dists/trusty-security/main/binary-amd64/

私は辞書がキーとして含む終わりに取得するために、正規表現を使用して、それを処理するためにあなたの助けをしたいと思い、このリンクでのPackages.gzファイルの存在のように複数の段落を持っていますパッケージとそれらが提供するパッケージのリストを評価します。

あなたが見ることができるように、いくつかのパッケージは他にはない1つ以上のパッケージを提供しません。私の最高の正規表現は以下の通りであった:「」なしの文章を、私はそれらすべてを必要とする:

((?<=Package:).*)|((?<=Provides:)(?:[, ]*[a-zA-Z0-9-+.]*)) 

それは「提供」の最初のパッケージに停止します。

何か助けていただければ幸いです。ありがとうございました。

+0

入力文字列とは何ですか?予想される出力は何ですか? –

+0

'*正規表現を使用していますか?'という明確な要件はありますか?このインスタンスでREを使用する理由を説明できますか? –

+0

入力がリンク上のテキストファイルの存在している、私は正規表現で見たように必要な出力は(使用のfindAll)は、パッケージ名を含むタプルのリストになるだろうと、それは – Marc

答えて

0

"パッケージ"行を "提供する"行を表すlistにマップするためのオブジェクトを作成するプログラムは、dictです。

要求されたように、それは、正規表現、およびre.findallを使用しています。

import re 
from pprint import pprint 

with open('Packages') as fp: 
    data = fp.read() 

data = re.findall(
    r''' 
    (?smx)     # Dot matches all, Multiline, Verbose 
    ^Package:\s*(.*?)$  # The package line 
    .*?     #  Arbitrary lines 
    (?: 
     ^Provides:\s*(.*?$) # The provides line 
     |     # OR 
     ^$     # an empty line 
    ) 
    ''', 
    data) 

data = {k:v.split(',') if v else [] for k,v in data} 

pprint(data) 

また、正規表現を使用しないソリューションもあります。私のPC上では、70,000行のファイルで少し速く動作します。しかし、速度の差はほとんど無関係です。その差は0.02秒未満である。

import re 
from pprint import pprint 

def gen(): 
    with open('Packages') as fp: 
     for line in fp: 
      if line.startswith('Package:'): 
       package = line.split(':')[1].strip() 
      elif line.startswith('Provides:'): 
       yield package, line.split(':')[1].strip().split(',') 
       package = None 
      elif package and line == '\n': 
       yield package, [] 
       package = None 
     if package: 
      yield package, [] 

data = dict(gen()) 

pprint(data) 
+0

ありがとうございました。 – Marc

1

あなたはここで車輪の再発明する必要はありません。 python-aptライブラリは、既に必要なテキストファイルの解析を実装しています。私はそれをお勧めします。パッケージにはprovidesのリストが表示されます。

+0

あなたの提案を理解していることを確認するには、パッケージを取得するために正規表現を使用することを意味しますか? – Marc

+0

いいえ、あなたは正規表現をまったくやり取りする必要はなく、そのような低レベルで構文解析や字句解析、あるいはそれを扱う必要はありません。ライブラリを使用してファイルをロードするだけです。それはあなたにリストを与えるでしょう。 – dsh

関連する問題