- 论坛徽章:
- 0
|
下面是python基础教程(第2版)即时标记项目中的一个片段:
#handlers.py
class Handler:
def callback(self, prefix, name, *args):
method = getattr(self, prefix+name, None)
if callable(method):return method(*args)
def start(self, name):
self.callback('start_', name)
def end(self, name):
self.callback('end_', name)
def sub(self, name):
def substitution(match):
result = self.callback('sub_', name, match)
if result is None: match.group(0)
return result
return substitution
class HTMLRenderer(Handler):
def start_document(self):
print '<html><head><title>...</title></head><body>'
def end_document(self):
print '</body></html>'
def start_paragraph(self):
print '<p>'
def end_paragraph(self):
print '</p>'
def start_heading(self):
print '<h2>'
def end_heading(self):
print '</h2>'
def start_list(self):
print '<ul>'
def end_list(self):
print '</ul>'
def start_listitem(self):
print '<li>'
def end_listitem(self):
print '</li>'
def start_title(self):
print '<h1>'
def end_title(self):
print '</h1>'
def sub_emphasis(self, match):
return '<em>%s</em>'%match.group(1)
def sub_url(self, match):
return '<a href = "%s">%s</a>'%(match.group(1), match.group(1))
def sub_mail(self,match):
return '<a href = "mailto:%s">%s</a>'%(match.group(1),match.group(1))
def feed(self, data):
print data
书中写到re.sub语句中可以使用sub这个函数,参照书上方法在命令行中运行如下
>>> from handlers import HTMLRenderer
>>> handler = HTMLRenderer()
>>> handler.sub('emphasis')
<function substitution at 0x01A60970>
>>> import re
>>> re.sub(r'\*(.+?)\*',handler.sub('emphasis'),'This *is* a test')
'This <em>is</em> a test'
问题一:
这里re.sub的repl不是一个字符串,而是一个函数,想请教re.sub是如何将match object传递给substitution函数的参数'match'的?可否给出一些之类的简单例子。
我print了一下,发现match是<_sre.SRE_Match object at 0x01A60CA0>
问题二:我看了下re.sub的源代码,
def sub(pattern, repl, string, count=0, flags=0):
return _compile(pattern, flags).sub(repl, string, count)
还是不知道sub是怎么实现的,在哪能看到源代码么,虽然可能看不懂,可是很想知道怎么找到源代码
|
|