2015-12-21 67 views
1

我在csv文件中有一些溫度數據,我只想提取一年中第一個月的溫度,所以在處理後我想要一個[1.4, -5.8]的列表下面。從匹配的正則表達式中提取數字數據

1866-01-01 00:00:01;1866-02-01 00:00:00;1866-01;1.4;G 
1866-02-01 00:00:01;1866-03-01 00:00:00;1866-02;-3.0;G 
1900-01-01 00:00:01;1900-01-01 00:00:00;1900-01;-5.8;G 

我想到用python模塊重做這個,但我總是遇到問題,以處理正則表達式!比如我的快速測試,下面所有的回報時,我只希望它從去年的第一個月返回條目線...

import numpy as np 
import re 


regex = '\d{4}-01-\d{2}\s\d{2}:\d{2}:\d{2};\d{4}-01-\d{2}\s\d{2}:\d{2}:\d{2};\d{4}-01;[-+]?\d*\.\d+|\d+;G' 

with open('test.csv', 'rb') as fid: 
    for line in fid: 
     match = re.findall(regex,line) 
     if match: 
      print line 
      print match 
+0

我建議使用CSV解析器。無論如何,你的正則表達式無法處理引用,而且它很醜陋。 – Robert

+0

我會認爲正則表達式可以輕鬆應對這種情況嗎?無論如何,你如何使用csv解析器來做到這一點? – Jack

回答

3

使用csv模塊,指定;作爲分隔符。在數據的第三列是YYYY-MM,所以檢查它是否是第一個月和打印溫度如果是:

import csv 

with open('data') as f: 
    for row in csv.reader(f, delimiter=';'): 
     year, month = row[2].split('-') 
     if int(month) == 1: 
      print(row[3]) 

輸出

 
1.4 
-5.8 

爲了便於比較,這裏是最簡單的正則表達式,我可以拿出來提取所需的值:

import re 

with open('data') as f: 
    temperature = re.findall(r'\d{4}-01;(.+?);', f.read()) 
    print('\n'.join(temperature)) 

你可以看到它是如何將更多的精力來讀&理解正則表達式,而不是Python代碼。

有依賴於你的數據,包括固定寬度的字段的更簡單的方法:我建議folling正則表達式

with open('data') as f: 
    for line in f: 
     if line[45:47] == '01': 
      print(line[48:-3]) 
+0

謝謝。會不會推薦正則表達式?我覺得可以用它來適應它,因爲有很多情況可以用它來提取數據以特定方式格式化時需要的內容。顯然在這個例子中,你的方法也很容易工作! – Jack

+1

但是這是越來越-3.0,這個問題的作者不想要。 – timgeb

+0

@timgeb:已更正,謝謝。 – mhawke

1

^(?:\d{4}-01-.*?)(-?\d+\.\d+) 

演示和說明的行爲:regex101
這個數字在第一個捕獲組中。 另外,以積極前瞻:

^(?=\d{4}-01).*?(-?\d+\.\d+) 

演示和說明的行爲:regex101

+0

這很好。我將不得不閱讀一下這個鏈接! – Jack

1

你必須把你的周圍要提取什麼括號。所以你應該把最後一部分改爲;([-+]?\d*\.\d+|\d+);G

試試這個代碼,並告訴我,如果它的工作原理:

import re 


regex1 = re.compile('\d{4}-01-\d{2}') 
regex2 = re.compile('([-+]?\d*\.\d+|\d+);G') 

with open('test.csv', 'rb') as fid: 
    for line in fid: 
     match1 = re.findall(regex1,line) 
     if match1: 
      match2 = re.findall(regex2, line) 
      print line 
      print match2 

希望這有助於。

+0

感謝您的迴應 - 但'匹配'只打印爲5.8' – Jack

+0

@Jack我現在修復它。我認爲test.csv總是包含這種格式的數據。 – shomz