2016-10-28 7 views
1

私のリストから、正規表現と一致するすべての文字列と、DictReaderに関連付けられたフィールド名のリストを作成する際に問題が発生しました。Dictreaderと正規表現インデックス作成の問題

私は文字列の配列をループし、各文字列がパターンと一致するかどうかを確認しようとしています:文字列がパターンにマッチする

reader = csv.DictReader(file) 
    for mystr in reader: 
     for i in range(len(mystr)): 
      if re.search(pattern, list(mystr.values())[i]): 
       data.append([list(reader.fieldnames)[i],list(mystr.values())[i]]) 

は、それがにマッチした文字列とCSVのフィールド名を追加しますリスト。

これはうまくいかないようですが、正しい正規表現の値に予想外のフィールド名を追加することに問題があるようです。

すなわちは、私のデータは

名称、所在地、価格

を命じられた場合は時々、正規表現の条件は価格に関連した数値にフィールド名の場所を追加するかどうか。

[[ 'firstitem']、[ 'seconditem']、[ 'thirditem']、[:そして

結果...値が仲間であるために何ら予測可能なパターンを持っていないようです'[firstitem'、 '1']、['seconditem']、['thirditem'、 '12']、['firstitem'、 '27']、['5thitem'、 '201']] [ 'fourthitem']、[ 'fifthitem']]

など。

番号すべてがちょうど彼ら、正しい順序で表示されます私がパターン/オーダーとして読むことができるものに整列していないので、なぜそれらがややランダムに見えるのかわかりません。どんな助けもありがとう。

+0

ファイルの内容は何ですか?データリストはどのように見えますか? – Billy

+0

また、私はあなたが "文字列の配列をループしている"とは思わない。あなたの '読者の中のmystrのための'ループの 'my​​str'はstrではなく、辞書になります。 – Billy

+0

両方の内容がすべての文字列であり、はいそれは辞書です。私はループしており、各要素を正規表現にマッチさせようとしています.csvの内容は基本的に5列の文字列ですが、私は正規表現と日付、価格、時刻形式で一致していますが、現時点では価格と一致しています。標準のint – D3181

答えて

2

私はあなたがこのようなコードを簡素化することができると思います。

reader = csv.DictReader(file) 
    for mystr in reader: 
     for fieldname, value in mystr.items(): 
      if re.search(pattern, value): 
       data.append([fieldname, value]) 

その方法、理解することは簡単です...

2

次のように完全に不自然なCSVを考えると(「のtest.CSV」として保存):

firstitem, seconditem, thirditem, fourthitem, fifthitem 
first, price, 1, nothing, important 
second, price, 2, over, here 

次に以下は整数ですべての列を抽出する必要があります

>>> def get_items(pattern, csv_file): 
     with open(csv_file) as file: 
      for entry in csv.DictReader(file): 
       for field_name, value in entry.items(): 
        if re.search(pattern, value): 
         yield [field_name, value] 

>>> data = list(get_items(r'\d+', 'test.csv')) 
[[' thirditem', ' 1'], [' thirditem', ' 2']] 

また、正規表現を使用する代わりに、if value.strip().isdigit()を条件文として使用することもできます。