首页 > 代码库 > python基础教程笔记-项目1-即时标记-Day4

python基础教程笔记-项目1-即时标记-Day4

今天主要看下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)




python基础教程笔记-项目1-即时标记-Day4