今天看Dive into Python 3 看到闭合与生成器,里面描述了一个使用闭合和文件来进行模式匹配的例子(P200),这里记录下。
先把我最后修改完的程序放出来:

  1. import re  
  2.   
  3. def build_match_and_apply_functions(pattern, search, replace):   
  4.   
  5.     def matches_rule(word):   
  6.         return re.search(pattern, word)   
  7.   
  8.     def apply_rule(word):   
  9.         return re.sub(search, replace, word)   
  10.   
  11.     return (matches_rule, apply_rule)   
  12.   
  13. rules = []   
  14.   
  15. with open(‘plural4-rules.txt’, encoding = ‘utf-8′) as pattern_file:   
  16.     for line in pattern_file:   
  17.         pattern, search, replace = line.split(none, 3)   
  18.         print(‘pattern:’, pattern, ‘search:’, search, ‘replace:’, replace, ‘\n’)   
  19.         rules.append(build_match_and_apply_functions(pattern, search, replace))   
  20.   
  21. def plural(noun):   
  22.     i = 1   
  23.     for matches_rule, apply_rule in rules:   
  24.         print(i, matches_rule(noun))   
  25.         i = i + 1   
  26.         if matches_rule(noun):   
  27.             return apply_rule(noun)   
  28.   
  29. if __name__ == ‘__main__‘:   
  30.     print(plural(‘box’))  

plural4-rules.txt:

[sxz]$ $ es
[^aeioudgkprt]h$ $ es
[^aeiou]y$ y$ ies
$ $ s

下面大概说下这个代码与书中代码的不同之处,主要是填了一些用于调试的内容:

第18行:将pattern、search、replace都显示出来,用来证实确实读取文件成功
第21行~27行:原文没有plural这个函数,我这个是根据plural3.py改写的,其实就是在rules列表里进行遍历,说起来,rules列表是前边用build_match_and_apply_functions()做出来的。
第24行:将每次遍历结果输出出来,方便调试

下面是重点:

为什么我要特意提下这个并不算怎么难的程序呢,因为我刚写完的时候运行完全不符合预期,所有字符串都直接加s就输出了,我是百思不得其解,而且用sublime text 2进行调试的时候还会报出什么gbk编码无法编码’feff’(UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\ufeff’ in position 0: illegal multibyte sequence)。相当无语啊……

经过反复测试检查和碰巧,终于发现与Windows自带的记事本有关……我用记事本编辑文件,然后在保存plural4-rules时特地用’UTF-8′来编码,结果就悲剧了。如果我换用sublime text 2来保存(保存为utf-8)就一切正常,功能也正常实现。

查了下资料才知道记事本保存utf-8时会带个BOM这个东西,这个东西之前看The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 了解到了BOM,但是完全没想到这玩意会如此厉害……

不过看到这里很多人都被这个问题折腾过,呵呵……

最后把程序运行的一个样子放出来:

 plural4-screenshot

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

你可以管理本篇文章的订阅。

Post Navigation