今天主要看下re.sub函数和Handler类的sub函数
先看下re.sub函数
re.sub共有5个参数,不过一般写前三个就好了,即pattern,repl和string
pattern表示正则中的模式字符串,repl可以是字符串,也可以是函数。string为要进行替换的字符串
先看一段代码:
import re def Num2A(match): return 'A' a = re.sub(r'(\d+)', Num2A, 'he123he') print a a = re.sub(r'(\d+)', r'A', 'he123he') print a
执行结果:
代码分别通过函数Num2A和字符串A,将字符串hehe123hehe转化为heAhe。
当re.sub的第二个参数repl为函数时,函数的返回值就是想替换的结果。
再看下Handler的sub函数
看下面一段代码
import re class Handler: def sub_emphasis(self, match): return '<em>%s</em>' % match.group(1) def callback(self, prefix, name, *args): method = getattr(self, prefix+name, None) if callable(method): return method(*args) def sub(self, name): def substitution(match): result = self.callback('sub_', name, match) if result is None: result = match.group(0) return result return substitution a = Handler() a = re.sub(r'\*(.+?)\*', a.sub('emphasis'), r'This *is* a test') print a
执行结果为:
可以看到sub返回了一个新函数,而这个函数会被当成re.sub中的替换函数来使用。
这里书上写错了,应该是
if result is None: result = match.group(0)
不是if result isNone:match.group(0)
因为如果在对象中没找到匹配的函数,result会为None,那么为了不对string做任何修改,应只是返回原来的方法,即return match.group(0)
原文地址:http://blog.csdn.net/miaoyunzexiaobao/article/details/43195155