CodeKata-Data Munging
2013-03-03 22:43 MichaelYin 阅读(335) 评论(0) 编辑 收藏 举报这次的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 ,很好用的正则工具猛戳这里