2016-10-28 22 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'],[ 'seconditem','27''],['fifthitem','201']]

[[''firstitem','1'],['seconditem'],['thirditem','12'], [ 'fourthitem'],[ 'fifthitem']

等。

數字都出現在正確的順序,他們只是在我看不懂的模式/順序中沒有對齊,所以我不知道爲什麼它們顯得有些隨意。任何幫助,將不勝感激。

+0

你的文件的內容是什麼,你想讓你的數據列表看起來像什麼? – Billy

+0

此外,我不認爲你是「循環訪問一系列字符串」。在你的'閱讀器中的mystr'循環中的'mystr'將是一本字典,而不是一個字符串。 – Billy

+0

好的,以解決這兩個內容都是字符串,是的這是一個字典,我循環並試圖匹配每個元素的正則表達式,csv的內容基本上是5列的字符串,其中3列,但唯一值我與日期,價格和時間格式匹配的正則表達式,但目前我只是匹配的價格,一個標準的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()作爲條件語句,而不必使用正則表達式。