从匹配的正则表达式中提取数字数据

时间:2015-12-21 23:22:51

标签: python regex

我在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

3 个答案:

答案 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}}

希望这有帮助。