代码改变世界

CodeKata-Data Munging

2013-03-03 22:43 MichaelYin 阅读(...) 评论(...) 编辑 收藏

这次的CodeKata主要训练的是正则的使用,之前了解正则是在Asp.net的URL处理上,比如进行URL的重写需要进行正则的匹配,这次正好学习学习。

第一个问题是对天气数据的提取,取出温度分布最小的那一天,使用正则中的group就可以很方便的取出相应的数据

第二个问题是根据英超成绩找出净胜球最接近0的球队原理和上一个相同,考察的也是正则表达式中的group,后面的无关数据不需要匹配,所以只要能确保解析到我要的数据就OK了。

第三个问题是对前两个问题的代码进行分析,提取出共用的部分,进行重用。考察前两个问题的代码,发现文件读取,正则处理,都是很类似的逻辑,所以将这部分进行提取抽象成一个类,将正则,相关参数和文件路径抽象成类,这样的话代码维护性也比较好,废话不多说,上代码

import re

class Input():
    def __init__(self, path, expression, key, firstindex, secindex):
        self.path = path
        self.expression = expression
        self.key = key
        self.firstindex = firstindex
        self.secindex = secindex
        
class Recorder(object):
    def __init__(self, input):
        self.key = None
        self.value = None
        self.input = input
    def add(self, key, first_value, sec_value):
        value = abs(int(first_value) - int(sec_value))
        if(self.key == None or value < self.value):
            self.key = key
            self.value = value
            
    def process(self):
        patten = re.compile(self.input.expression)
        file = open(self.input.path, 'r')
        for line in file.readlines():
            match = patten.search(line)
            if(match):
                self.add(match.group(self.input.key), match.group(self.input.firstindex), match.group(self.input.secindex))
        file.close()
        print "find the key %s" % self.key       
            
input = Input(r'D:\football.dat', \
              r'\d\.\s(\w+)\s+(\d+\s+){4}(\d+)\s{2}-\s{2}(\d+)', \
              1, \
              3, \
              4)
recorder = Recorder(input)
recorder.process()

处理不同的文件,使用不同的input传入进去就行了

另附正则学习资源

张子阳写的正则表达式的教程猛戳这里

Regex Match Tracer ,很好用的正则工具猛戳这里