我在csv文件中有一些温度数据,我想只提取一年中第一个月的温度,所以在处理后我想在下面的例子中列出[1.4, -5.8]
。 / p>
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 :(得分: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))
您可以看到如何更加努力地阅读&amp;理解正则表达式而不是Python代码。
有一种更简单的方法依赖于由固定宽度字段组成的数据:
with open('data') as f:
for line in f:
if line[45:47] == '01':
print(line[48:-3])
答案 1 :(得分:1)
我建议使用正则表达式:
^(?:\d{4}-01-.*?)(-?\d+\.\d+)
演示的演示和解释:regex101
该号码位于第一个捕获组中。
或者,有一个积极的前瞻:
^(?=\d{4}-01).*?(-?\d+\.\d+)
演示的演示和解释:regex101
答案 2 :(得分:1)
您必须在要提取的内容周围放置括号。因此,您应该将最后一部分更改为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
。
试试这段代码告诉我它是否有效:
{{1}}
希望这有帮助。