从匹配的正则表达式中提取数字数据
问题描述:
我在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
答
使用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])
答
你必须把你的周围要提取什么括号。所以你应该把最后一部分改为;([-+]?\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
希望这有助于。
我建议使用CSV解析器。无论如何,你的正则表达式无法处理引用,而且它很丑陋。 – Robert
我会认为正则表达式可以轻松应对这种情况吗?无论如何,你如何使用csv解析器来做到这一点? – Jack