《Python基础教程》第20章学习笔记

python实现:https://github.com/captainwong/instant_markup

c++实现:https://github.com/captainwong/instant_markup_cpp

要点:

1.标准输入输出流的重定向

python markup.py < test_input.txt > test_output.html

上述命令将标准输入设备重定向为文件input.txt,将标准输出设备重定向为文件test_output.html。

Python中使用的标准输入设备为sys.stdin, 输出使用函数print。C语言使用stdin和函数printf等。c++使用cin。 cout。

2.使用字符串调用函数

如依据字符串"foo"查找函数foo并调用之。

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

使用时可通过调用

start(‘document‘)

来调用start_document函数。

c++无此特性。这里我使用map保存函数名和函数指针的方法来模拟这样的功能。

首先定义函数指针:

typedef void (CHandler::*pFunc)();

定义静态map成员:

static map<string, pFunc> m_funcmap;

使用宏定义简化初始化操作:

#define STR(str) #str
#define ASSIGN_FUNC(func_name) 	CHandler::m_funcmap[STR(func_name)] = (CHandler::pFunc)&func_name;

初始化:

CHTMLRenderer::CHTMLRenderer()
{
	ASSIGN_FUNC(CHTMLRenderer::start_document);
	ASSIGN_FUNC(CHTMLRenderer::end_document);
	ASSIGN_FUNC(CHTMLRenderer::start_paragraph);
	ASSIGN_FUNC(CHTMLRenderer::end_paragraph);
	ASSIGN_FUNC(CHTMLRenderer::start_heading);
	ASSIGN_FUNC(CHTMLRenderer::end_heading);
	ASSIGN_FUNC(CHTMLRenderer::start_list);
	ASSIGN_FUNC(CHTMLRenderer::end_list);
	ASSIGN_FUNC(CHTMLRenderer::start_listitem);
	ASSIGN_FUNC(CHTMLRenderer::end_listitem);
	ASSIGN_FUNC(CHTMLRenderer::start_title);
	ASSIGN_FUNC(CHTMLRenderer::end_title);
	ASSIGN_FUNC_SUB(CHTMLRenderer::sub_emphasis);
	ASSIGN_FUNC_SUB(CHTMLRenderer::sub_url);
	ASSIGN_FUNC_SUB(CHTMLRenderer::sub_mail);
}

调用方法:

void CHandler::callback(const string &str)
{
	funcmap_iter iter = m_funcmap.find(str);
	if(iter != m_funcmap.end())
		(this->*(iter->second))();
	else
		cout << "invalid function name : " << str << endl;
}

void CHandler::start(const string &func_name)
{
	callback(string("CHTMLRenderer::start_") + func_name);
}

void CHandler::end(const string &func_name)
{
	callback(string("CHTMLRenderer::end_") + func_name);
}

3.使用正則表達式

Python标准库提供了re包来进行正則表達式的处理。而c++标准库没有实现regex,boost::regex功能强大,但为了写一个小demo,包括一大堆库太麻烦。

我使用一个轻量级的开源c++实现正则库deelx。官网: http://www.regexlab.com/

整个库就是一个头文件deelx.h,使用时include之就可以。

演示样例:

string filtering(const string& block, const string& pattern,
				const string& sub_name, CHandler* handler){
	static CRegexpT <char> regexp;
	regexp.Compile(pattern.c_str());
	MatchResult result = regexp.Match(block.c_str());
	if(result.IsMatched()){
		char* content = regexp.Replace(block.c_str(),
			handler->sub(sub_name).c_str());
		string new_block(content);
		regexp.ReleaseString(content);
		return new_block;
	}
	return block;
}

deelx源代码与文档可在其官网下载。

结果例如以下图:

时间: 2024-10-15 21:50:53

《Python基础教程》第20章学习笔记的相关文章

Python基础教程 第六章 学习笔记

收集函数 把实际参收集到元组和字典当中 1 def print_params(*params): 2 print(params) 3 """ 4 print_parasm(1,2,3) 5 output: (1,2,3) 6 """ 7 8 def print_params_2(**params): 9 print(params) 10 11 """ 12 print_params_2(x=1, y=2, z=3)

Python基础教程(第二章 列表和元组)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5293195.html______ Created on Xu Hoo 本章将引入一个新的概念:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence),序列中的每个元素被分配一个序号——即

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

python基础教程:第一章

引言 Python是一门计算机能够理解的语言.功能强大,容易入门.是初学者学习编程语言不错的选择.本篇属于python基础知识.简单介绍了变量.函数.模块和字符串的知识. 内容 主要介绍变量.语句.函数.获取用户输入.模块.字符串等知识. 推荐书籍 <python基础教程> <python核心编程>

Python基础教程 第2章: 列表和元组 学习笔记

序列是一种数据结构, 它包含的元素都进行了编号(从0开始).典型的序列包括列表.字符串和元组.其中,列表是可变的,而元组和字符串是不可变的. 个人感觉列表跟C语言中的数组很相似,但也有不用之处,比如在数组中元素的类型都是一样的,而在列表中元素的类型可以混合. 索引(下标): 与C语言中的数组一样,列表支持下标访问,通过下标来访问列表中的元素. #序列赋值 x = [1, 2, 3, "hello", 'abc'] print x #下标访问 print x[0] print x[3]

Python基础教程 第8章: 异常 学习笔记

文章部分内容参考至: http://www.runoob.com/python/python-exceptions.html 主动抛异常: class MyException(Exception): pass #相当于c++中的throw, 主动抛异常 raise MyException >>> Traceback (most recent call last): File "hello.py", line 4, in <module> raise MyE

Python基础教程 第11章: 文件和流 学习笔记

本文部分内容转载于: http://www.runoob.com/python/python-files-io.html http://docs.pythontab.com/python/python2.7/inputoutput.html#tut-files 打开文件: 你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的辅助方法才可以调用它进行读写.语法: file object = open(file_name [, access_mode][, buff

【读书笔记】《Python基础教程》第一章 基础知识

第一章 基础知识 实现两个数整除:使用命令开关 -Qnew (?): 使用双斜线. from future import division 执行向计算器那样的普通除法. 幂(乘方)运算符: 2 ** 3 (8),用函数代替 pow(2,3),内建函数 长整数型:在数字结尾加L.eg:10000000000000L 获取用户输入 input("提示信息 :") eg: x = input("x: ") .输入的是合法的python表达式 raw_input("

python基础教程第2章——列表与元组笔记

1.序列是Python中最基本的数据结构.序列中的每个元素被分配一个序列号——元素的位置,也称索引,第1个索引是0,第2为1,以此类推.序列中的最后1个元素为-1,倒数第2个位-2. python中有6中内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象. 2.通用序列操作:索引(indexing).分片(sliceing).加(adding).乘(multiplying).检查某个元素是否属于序列成员.计算序列长度.找出最大元素和最小元素的内建函数. 两种