2015-12-21 66 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