Python核心编程 第3版(txt+pdf+epub+mobi电子书下载)

作者:(美)卫斯理 春(Wesley Chun)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python核心编程 第3版

Python核心编程 第3版试读:

内容提要

本书是经典畅销图书《Python核心编程(第二版)》的全新升级版本,总共分为3部分。第1部分讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI编程、数据库编程、Microsoft Office编程、扩展Python等内容。第2部分讲解了与Web开发相关的主题,包括Web客户端和服务器、CGI和WSGI相关的Web编程、Diango Web框架、云计算、高级Web服务。第3部分则为一个补充/实验章节,包括文本处理以及一些其他内容。

本书适合具有一定经验的Python开发人员阅读。

本书赞誉

“本书简洁而不失其技术深度,内容丰富全面,历史资料翔实齐全,这让本书成为学习Python的完美教程。本书易于阅读,以极简的文字介绍了复杂的案例,同时涵盖了其他同类图书中很少涉及的历史参考资料。简而言之,本书棒极了!”——Gloria.W本书之前版本的赞誉“期待已久的Core Python Programming(第2版)已经证明了本书确实值得期待——它深度与广度齐备,其中囊括的有用练习可以帮助读者掌握Python并付之于实践。”——Alex Martelli,Python in a Nutshell作者兼Python Cookbook编辑“Wesley Chun的Core Python Programming一书好评如潮,而且它也证明它配得上所有的好评。我想该书是当前学习Python的最佳图书。在市面上众多的Python图书中,我觉得Chun的这本书是最好的,因此强烈推荐本书。”——David Mertz博士,IBM DeveloperWorks“在过去多年,我一直在从事Python的研究,发现本书获得了大量的正面评价。这些评价证实了这样一个观点,即Core Python Programming被认为是标准的Python入门读物。”——Richard Ozaki,Lockheed Martin公司“终于,一本既可以作为Python教程又可以作为Python编程语言参考的图书问世了!”——Michael Baxter,Linux Journal“本书写作相当精良。这是我遇到的最清晰、最友好的Python图书,它在一个广阔的背景下介绍了Python。它仔细、深入地剖析了一些重要的Python主题,而且读者无需大量的相关经验也能看懂。与其他所有Python入门类图书不同的是,它不会用隐晦、难以理解的文字来折磨读者,而是始终立足于帮助读者牢固掌握Python的语法和结构。”——http://python.org bookstore Web site“如果我只能有一本 Python 图书,那它肯定是 Wesley Chun 著作的 Core Python Programming。本书成功地涵盖了Python的多个主题,其详细程度远甚于Learning Python一书,而且涵盖的主题也远非Python核心语言这么简单。如果你只打算购买一本Python图书,我强烈推荐本书。你不仅会爱上本书,而且会爱上本书中包含的真知灼见。重要的是,你将学会Python。更更重要的是,你会发现本书会在你每日的Python编程生活中提供各种帮助。写得不错,Chun先生!”——Ron Stephens,Python学习基金会“我认为编程初学者的最佳语言是Python,这毋庸置疑!我最喜欢的图书是Core Python Programming。”——s003apr,MP3Car.com论坛“就我个人而言,我相当喜欢 Python。它易于学习、非常直观、相当灵活,而且执行速度也相当快。在Windows领域中,Python虽然只是刚崭露头角,但是由于越来越多的人发现了它,因此选择从Python起步可以获得大量的支持。要学习Python,我选择从Wesley Chun的这本Core Python Programming起步。”——Bill Boswell,MCSE,微软认证专家在线杂志“如果你通过图书来学习编程,我推荐Core Python Programming,它是目前为止我发现的最佳Python图书。我也是一个Python新手,但是在3个月之后,我就可以在项目中实现Python了(自动处理MSOffice、SQL DB等)。”——ptonman,Dev Shed论坛“Python 是一种美丽的语言。它易于学习、跨平台,而且能够良好运行。它已经实现了Java一直想要实现的很多技术目标。对Python的一句话描述是‘所有其他语言随着时间发生演进,但 Python 是设计出来的。’而且 Python 设计得相当不错。虽然现在市面上有大量的Python图书,但是目前为止我遇到的最好的一本是Core Python Programming。”——Chris Timmons,C.R.Timmons Consulting公司“如果你喜欢Prentice Hall出版社的Core系列图书,你需要考虑的另一本写作精良的图书是Core Python Programming。它将其他Python图书中很少涵盖的许多实用主题进行了事无巨细的剖析。”——Mitchell L.Model,MLM Consulting公司

关于作者

Wesley Chun在高中阶段开始进入计算领域,当时他使用的是BASIC和6502汇编语言,系统是Commodore。随后开始在Apple IIe上使用Pascal语言,然后是在穿孔卡片上使用ForTran语言。正是在穿孔卡片上使用ForTran的经历使他成为一名谨慎小心的开发人员,因为将一组卡片发送到学校的主机并得到返回结果,往往需要一周的往返时间。他第一份有酬劳的工作是作为学生辅导员为四年级、五年级和六年级的学生及其父母家讲授 BASIC编程课程。

高中毕业后,Wesley以加利福尼亚校友学者的身份进入加州大学伯克利分校。他主修应用数学(计算机科学),辅修音乐(古典钢琴),并以A级和B级的成绩毕业。在学校期间,他先后使用Pascal、Logo和C语言编写过程序。他还参加了一个以录像带培训和心理咨询为特色的辅导课程。他的暑期实习项目包括以第4代编程语言编写代码,并编写了一个“Getting Started”用户手册。几年过后,他开始在加州大学圣巴拉拉分校继续学习,并获得了计算机科学(分布式系统)的硕士学位。在此期间,他还讲授C编程课程。一篇以其硕士论文为基础的论文在第29届HICSS大会上被提名为最佳论文,其随后的一个论文版本刊登在新加坡大学Journal of High Performance Computing上。

自从毕业之后,Wesley就投身于软件行业,编写和出版了多本图书,并且发表了数百篇会议报告和教程。此外还开发了针对公共企业和私有企业培训的 Python 课程。Wesley 的Python使用经历始于Python 1.4版本(当时Python刚刚起步),他使用Python设计了Yahoo!Mail拼写检查程序以及地址簿。他随后成为Yahoo!People Search部门的首席工程师。在离开Yahoo!之后,他写作了本书第1版,然后开始周游世界。回来之后,他使用Python编写过许多程序,包括本地产品搜索程序、反垃圾邮件和防病毒邮件程序、Facebook游戏/应用,以及许多完全不同的其他东西,比如医生用来进行脊柱骨折分析的软件。

在闲暇时间,Wesley喜欢弹钢琴、打保龄球、打篮球、骑自行车、玩极限飞盘、打扑克、旅行,以及与家人共享人伦。他还是Tutor邮件列表和PyCon这两个Python用户组的志愿者。他还维护着艾伦帕森斯怪物项目目录(Alan Parsons Project Monster Discography)。在本书写作之时,Wesley是Google的开发大使,为其云产品背书。Wesley生活在硅谷,您可以通过@wescpy或plus.ly/wescpy找到他。前言

欢迎各位读者打开本书

很高兴各位读者能够允许我们来帮助你们尽可能快、尽可能深入地学习 Python。Core Python系列图书的目标不只是教会开发人员Python语言,我们还希望各位读者能够形成足够的知识库,从而能够开发任何应用领域的软件。

在其他的Core Python系列图书(Core Python Programming和Core Python Language Fundamentals)中,我们不仅向读者讲授Python语言的语法,还希望读者能够深入掌握Python的运行机制。我们相信,在具备了这些知识之后,无论你是Python语言的初学者还是资深程序员,都能够开发出更为高效的Python应用程序。

在学完任何其他入门类的Python图书之后,你可能觉得已经掌握了Python而且还觉得学得不错,并为此感到自豪。通过完成大量练习之后,你将会对自己新掌握的Python编程技能拥有更多信心。但是,你可能仍然会有这样的疑问,“现在该怎么办?我能用Python编写哪种类型的应用程序呢?”或许你是为了一个相当小众的工作项目而学习使用Python,你可能会考虑“我还能用Python写点其他的吗?”关于本书

在本书中,你将会用到从其他地方学习到的所有Python知识,并培养新的技能,从而构建自己的工具箱。借助于该工具箱,你能够使用Python开发各种类型的应用程序。关于高级主题的章节旨在快速概述各种不同的主题。如果你开始转向这些章节中涵盖的特定应用开发领域,你将会发现它们不仅给出了正确的方向,还包含了更多的信息。但是不要期待有一个深入的解决方案,因为这有悖于本书的初衷——提供更为广泛的解决方案。

与其他所有Core Python图书一样,本书同样包含了许多示例,你可以在计算机上进行尝试。为了牢固掌握概念,你也会在每章最后发现有趣、有挑战性的练习。这些初级和中级难度的练习旨在测试你的知识掌握情况,提升你的Python技能。毕竟,没有什么可以替代实践经验。我们相信,你不仅能够学到很多Python编程技能,同时还能在尽可能短的时间内迅速掌握它们。

对我们来讲,扩展Python技能的最佳方式就是动手练习,因此你会发现这些练习是本书的一个最大优势。它们可以测试你对每章主题和定义的掌握情况,并激励你尽可能多地动手编程。除了自己编写应用程序之外,没有其他方法可以更有效地提升你的编程技能。你需要解决初级、中级和高级难度的编程问题。而且你应该需要编写一个大型的应用程序(这也是很多读者想要在本书中看到的),而不是采用一些脚本来实现。坦白说,你可能做得没有那么好,但是通过亲自动手实践,你的收获会更大。附录A给出了每章中某些练习的答案。附录B包含了一些有用的参考表。

感谢所有读者的反馈和鼓励,你们是我写作这些图书的动力。希望你们能继续给我发送反馈信息,并促使本书第4版尽快问世,而且其质量优于之前所有版本。本书读者对象

如果你之前了解Python,并且希望进一步了解Python,同时希望扩展自己的应用程序开发技能,你就是本书的读者对象。

在众多领域中都可见Python的身影,包括工程领域、信息技术领域、科学领域、商业领域和娱乐领域等。这意味着Python用户(和本书的读者)列表包括但不限于下述人员:

软件工程师;

硬件设计/CAD工程师;

QA/测试和自动化框架开发人员;

IS/IT/系统和网络管理员;

科学家和数学家;

技术或项目管理人员;

多媒体或音频/视觉工程师;

SCM或发布工程师;

Web大师或内容管理人员;

客户/技术支持工程师;

数据库工程师和管理员;

研发工程师;

软件集成和专业服务人员;

大学及中学教育工作者;

Web服务工程师;

金融软件工程师;

其他人员。

使用Python的一些著名公司包括Google、Yahoo!、NASA、卢卡斯工业光魔公司、Red Hat、Zope、迪士尼、皮克斯和梦工厂。作者与Python

大约10多年以前,我在一家名为Four11的公司接触到Python。当时,该公司有一个主要的产品——Four11.com White Page目录服务。它们使用Python来设计该产品的下一代:Rocketmail Web E-mail服务,该服务最终演变为今天的Yahoo!Mail。

学习Python并加入最初的Yahoo!Mail工程团队是一件相当有趣的事情。我帮助重新设计了地址簿和拼写检查程序。在当时,Python也成为其他Yahoo!站点的一部分,其中包括People Search、Yellow Pages、Maps和Driving Directions等。事实上,我当时是People Search部门的首席工程师。

尽管在当时Python对我而言是全新的,但是它也很容易学习——比我过去学习的其他语言都要简单。在当时,Python 教程的缺乏迫使我使用 Library Reference 和 Quick Reference Guide作为主要的学习工具,而这也是促使我写作本书的一个驱动力。

从我在Yahoo!的日子开始,我能够以各种有趣的方式在随后的工作中使用Python。在任何情况下,我都能使用Python 的强大功能来及时地解决遇到的问题。我也开发了多门 Python课程,并使用本书来讲授那些课程——完全使用自己的作品。

Core Python图书不仅是卓越的Python学习资料,它们还是用来讲解Python的最佳工具。作为一名工程师,我知道学习、理解和应用一种新技术所需要的东西。作为一名专业讲师,我也知道为客户提供最有效的会话(session)所需要的是什么。这些图书栩栩如生,同时包含你无法从“纯粹的培训师”或“纯粹的图书作者”那里获得的提示。对本书写作风格的期待:以讲解技术为主,同时容易阅读

不同于严格的“入门”图书或者纯粹的“重口味”计算机科学参考图书,我过去的教学经验告诉我,一本易于阅读同时又面向技术的图书应该服务于这样的一个目的,即能够让人尽可能迅速地掌握Python,以便能将其应用到十万火急的任务上来。我们在介绍概念时会辅之以合适的案例,以加速学习过程。每章最后都会给出大量练习,旨在夯实你对书中概念和理念的理解。

能够与Bruce Eckel的写作风格相提并论,我很激动也很谦卑(见本书第1版的评论,网址为 http://corepython.com)。本书并非一本枯燥的大学教材,我们的目标是营造一个与你交谈的环境,就像你是在参加我的一个广受好评的Python培训课程一样。作为一名终身学习的学生,我不断地因材施教,告诉你需要学习什么才能快速、彻底地掌握Python的概念。你也将发现,可以快速、轻松地阅读本书,而且不会错失任何技术细节。

作为一名工程师,我知道应该怎样做才能向你讲授Python中的概念。作为一名教师,我可以将技术细节全部打散,然后转换成一种易于理解和迅速掌握的语言。你将从我的写作风格和教学风格中获益,更重要的是,你会喜欢上用Python来编程。

因此,你也将注意到,尽管我是本书唯一的作者,但是我使用的是“第三人称”的写作风格,也就是说,我使用了诸如“我们”这样的一些废话,原因是在学习本书的过程中,我们是一起的,共同朝着扩展Python编程技能的目标而努力。关于本书第3版

在本书第1版刚问世时,Python刚发布了2.0版本。从那时起,Python语言发生了重大的改进,Python语言被越来越多的人接受,其使用率也大幅提升。Python编程语言大获成功。Python语言的缺陷已被删除,而且有新的特性不断加入,这将全世界Python开发人员的能力和编程修养提升到了一个新的水平。本书第2版于2006年问世,当时也是Python的鼎盛时期,它的版本是迄今为止最为流行的2.5版本。

本书第2版问世之后好评如潮,其销量超过了第1版。在那期间,Python本身也赢得了无数荣誉,包括下面这些。

Tiobe(www.tiobe.com)

——年度编程语言(2007年、2010年)

LinuxJournal(linuxjournal.com)

——最喜欢的编程语言(2009~2011年)

——最喜欢的脚本语言(2006~2008年、2010年、2011年)

LinuxQuestions.org会员选择奖

——年度编程语言(2007~2010年)

这些奖项和荣誉推动着Python进一步发展。现在,Python已经进入了下一代:Python 3。同样,本书也在向着其“第三代”前进。我非常高兴Prentice Hall能够让我写作本书第3版。由于Python 3.x版本不能够后向兼容Python 1和Python 2,因此还需要一段时间,Python 3.x才能被业界全面采用和集成进来。我们很乐意引导你经历这个过渡。本书第3版的代码也适用于Python 2和Python 3(视情况而定——并非所有代码都移植了过来)。在移植代码时,我们还会讨论各种工具和做法。

Python 3.x 版本带来的挑战延续着对 Python 编程语言进行迭代和改进的趋势,要移除Python语言最后的重大缺陷还有很长的路要走,而且在不断演变的Python语言中移除重大缺陷也是一个相当大的飞跃。与之相似,本书的结构也做出了相当重大的转变。限于篇幅和范围,已出版的第2版无法处理第3版中引入的所有新内容。

因此,Prentice Hall和我想到了一个好方法来向前推进本书,即从逻辑上将其拆分为两部分,其中一部分讲述Python核心语言主题,另一部分讲述高级应用主题,并由此将书拆分为两卷。而你手头上当前拿着的这本书是Core Python Programming(第3版)的第二部分。好消息是由于第二部分的内容已经相当完整齐备,因此第一部分的内容也就没有存在的必要了。要阅读本书,我们建议读者能够拥有Python中级编程经验。如果你最近已经学过Python,而且能够相当轻松地驾驭它,或者你已经具备Python技能,但是希望能进一步提升该技能,那么你算是找对图书了。

Core Python Programming的读者都知道,我的主要目标是以一种全面的方式来讲解Python语言的本质,而非仅仅是其语法(学习Python的语法貌似也不需要一本书)。在知道了Python的工作机制之后——包括数据对象和内存管理之间的关系——你将成为一名更高效的 Python程序员。而这是第一部分(即Core Python Language Fundamentals)要做的工作。

与本书所有版本一样,我会继续更新图书的Web站点以及博客,以确保无论你移植到哪个新发布的Python版本,都可以让本书做到与时俱进。

对之前的读者来说,本书第3版新增了下述主题:

基于Web的E-mail示例(第3章);

使用Tile/Ttk(第5章);

使用MongoDB(第6章);

更重要的Outlook和PowerPoint示例(第7章);

Web服务器网关接口(WSGI)(第10章);

使用Twitter(第13章);

使用Google+(第15章)。

此外,我们还在当前版本中添加了全新的3章,分别是第11章、第12章和第14章。这几章代表着经常使用Python进行应用开发的一些新领域或正在进行的领域。所有的现有章节已经焕然一新,并更新到Python的最新版本,同时还包含了一些新内容。通过随后的“章节指南”部分,你可以了解到本书每部分要讲解的内容。章节指南

本书分为3部分。其中第1部分占据了本书2/3的篇幅,它讲解了应用开发工具箱中(当然,Python是关注重点)“核心”成员的解决方案。第2部分讲解了与Web编程相关的各种主题。第3部分是补充部分,它提供了一些仍然在开发过程中的实验章节,在本书后续版本中,这些章节有望成为独立的章节。

本书提供了一些高级主题,以展示Python可以用来开发什么应用程序。值得高兴的是,本书起码可以向你提供Python开发中许多关键领域的入门知识,其中包括之前版本中提到的一些主题。

下面是本书每章的内容简介。第1部分:通用应用主题第1章——正则表达式

正则表达式是一种功能强大的工具,它可以用来进行模式匹配、提取、查找和替换。第2章——网络编程

如今许多应用都是面向网络的。该章将介绍如何使用TCP/IP与UDP/IP来创建客户端和服务器,以及如何快速入门SocketServer和Twisted。第3章——因特网客户端编程

如今在用的大多数 Internet 协议都是使用套接字开发的。该章将探究一些用来构建Internet协议客户端的高级库。该章重点讨论的是FTP、Usenet消息协议(NNTP)以及各种E-mail协议(SMTP、POP3及IMAP4)。第4章——多线程编程

多线程编程是一种通过引入并发来提升多种应用程序执行性能的方式。该章通过解释概念并展示正确创建Python多线程应用程序的方法、什么是最佳用例来讲解如何在Python中实现线程。第5章——GUI编程

Tkinter(在Python 3中重名为tkinter)以Tk图形工具包为基础,是Python中的默认GUI开发库。该章通过演示如何创建简单的GUI应用来介绍Tkinter。一种最佳的学习方式是复制,并在某些应用的顶层进行创建,这样可以很快上手。该章最后简要讨论其他图形库,比如Tix、Pmw、wxPython、PyGTK和Ttk/Tile。第6章——数据库编程

Python也有助于简化数据库编程。该章首先回顾一些基本概念,然后介绍Python数据库应用编程接口(DB-API)。随后介绍如何使用Python连接到关系数据库,并执行查询和操作。如果你更喜欢使用结构化查询语言(SQL)的放手管理方法(hands-off approach),而且只是想在无须考虑底层数据库层的情况下处理对象,则可以使用对象-关系映射。最后,该章以MongoDB作为NoSQL示例介绍了非关系数据库。第7章——Microsoft Office编程

无论喜欢与否,我们都生活在一个不得不和Microsoft Windows PC打交道的世界。我们可能偶尔与它们打交道,也可能每天都要接触到它们,但是无论处于哪种情况下,都可以使用Python的强大功能来让生活更轻松一些。该章将探究使用Python来编写COM客户端,以控制Office应用程序(比如Word、Excel、PowerPoint和Outlook)并与它们进行通信。尽管该章在本书之前版本中是实验章节,但是我们很高兴能够为其添加足够的内容,使其单独成章。第8章——扩展Python

前面提到,能够重用代码并对语言进行扩展将具有相当强大的功能。在纯Python中,这些扩展是模块和包,但是你也可以使用C/C++、C#或Java来开发底层的代码。这些扩展能够以无缝方式与Python相接。用低级编程语言来编写自己的扩展可以提升性能,并增强安全性(因为源代码没有必要泄露)。该章讲解使用C语言来开发扩展的整个过程。第2部分:Web开发第9章——Web客户端和服务器

该章将扩展第 2 章讨论的客户端/服务器架构,我们将这一概念应用到 Web上。该章不仅探究客户端,还介绍用来解析 Web内容的各种Web客户端工具。最后,该章介绍如何使用Python来定制自己的Web服务器。第10章——Web编程:CGI和WSGI

Web 服务器的主要工作是接受客户端的请求,然后返回结果。但是服务器如何获得客户端的请求数据呢?由于服务器只擅长返回结果,因此它们通常没有获取数据的能力或逻辑,于是这个工作需要在他处完成。CGI给了服务器生成另外一个程序的能力,让这个程序来进行数据处理(长久以来一直也是这么做的),但是该程序不具备扩展性,因此并不会在实践中使用。但是,无论使用的是什么框架,这一概念仍然适用,因此我们将用一章的篇幅来学习 CGI。该章介绍 WSGI 如何通过通用编程接口来为应用开发人员提供帮助。此外,该章还将介绍当框架开发人员需要在一端连接 Web 服务器而应用程序的代码放在另外一端时,WSGI如何提供帮助,以便应用开发人员能够在无须担心执行平台的情况下编写代码。第11章——Web框架:Django

Python 有很多 Web 框架,Django 是其中最为流行的一个。该章介绍这个框架,然后介绍如何编写简单的Web应用。在具备了这些知识后,你可以自行研究其他Web框架。第12章——云计算:Google App Engine

云计算在 IT 业界引发了轰动。尽管像 Amazon 的 AWS 这样的基础设施服务和 Gmail、Yahoo!Mail这样的在线应用等在当今世界中更为常见,但是有很多平台凭借其强大的功能,成为这些服务的替代者。这些平台充分利用了基础设施,无须用户介入,而且要比云软件具有更多的灵活性,原因是你可以自行控制应用及其代码。该章全面介绍使用 Python 的第一个平台服务——Google App Egnine。在掌握了该章的内容后,你可以探讨该章介绍的其他类似服务。第13章——Web服务

该章介绍Web上的高级服务(使用HTTP)。该章先介绍一个较为古老的服务(Yahoo!Finance),然后再给出一个较新的服务(Twitter)。该章讨论如何使用Python以及前面学到的知识来与这些服务进行交互。第3部分:补充/实验章节第14章——文本处理

这是本书的第一个补充章节,它介绍使用Python来处理文本的方法。该章先介绍CSV,然后是JSON,最后是XML。在该章最后一节,我们将前面学到的客户端/服务器知识融合到XML中,以查看如何使用XML-RPC来创建在线的远程过程调用(RPC)。第15章——其他内容

该章包含一些附加材料,这些内容可能会在本书下一版中成为单独的章节。该章讨论的主题包含Java/Jython和Google+。图书资源

我们欢迎任何形式的读者反馈。如果你有任何意见、建议、投诉、抱怨、bug,甚至任何事情,请通过corepython@yahoo.com与我联系。

在本书的Web站点(http://corepython.com)上,你可以找到勘误表、源代码、更新、即将举行的会谈、Python 培训、下载地址和其他信息。在本书的 Google+页面(http://plus.ly/corepython),你可以参与和本书有关的社区讨论。致谢本书第3版的致谢审稿人和贡献人

Gloria Willadsen(首席审稿人)

Martin Omander(审稿人兼第11章、15.2节的合著者)

Darlene Wong

Bryce Verdier

Eric Walstad

Paul Bissex(Python Web Development with Django一书的合著者)

Johan“proppy”Euphrosine

Anthony Vallone献辞

感谢我的妻子 Faye,无论我在路上开车时,还是在家埋头写作时,她总是将家庭照顾得井井有条,娴熟照顾孩子的起居和作息,并妥善处理家庭各种开支,因此她总是能够不断给我惊喜。编辑

Mark Taub(总编辑)

Debra Williams Cauley(策划编辑)

John Fuller(执行编辑)

Elizabeth Ryan(项目编辑)

Bob Russell,Octal Publishing公司(文字编辑)

Dianne Russel,Octal Publishing公司(产品与管理服务)本书第2版的致谢审稿人和贡献人

Shannon –jj Behrens(首席审稿人)

Michael Santos(首席审稿人)

Rick Kwan

Lindell Aldermann(第6章Unicode小节的合著者)

Wai-Yip Tung(第20章Unicode案例的合著者)

Eric Foster-Johnson(Beginning Python一书的合著者)

Alex Martelli(Python Cookbook一书的编辑以及Python in a Nutshell一书的合著者)

Larry Rosenstein

Jim Orosz

Krishna Srivivasan

Chuck Kung献辞

感谢我的孩子!本书第1版的致谢审稿人和贡献人

Guido van Rossum(Python语言的创始人)

Dowson Tong

James C.Ahlstrom(Internet Programming with Python一书的合著者)

S.Candelaria de Ram

Cay S.Horstmann(Core Java一书和Core JavaServer Faces一书的合著者)

Michael Santos

Greg Ward(distutils包及其文档的创始人)

Vincent C.Rubino

Martijn Faassen

Emile van Sebille

Raymond Tsai

Albert L.Anders(MT Programming章节的合著者)

Fredrik Lundh(Python Standard Library一书的合著者)

Cameron Laird

Fred L.Drake,Jr.(Python&XML一书的合著者以及Python官方文档的编辑)

Jeremy Hylton

Steve Yoshimoto

AahzMaruch(Python for Dummies一书的合著者)

Jeffrey E.F.Friedl(Mastering Regular Expressions一书的合著者)

Pieter Claerhout

Catriona(Kate)Johnston

David Ascher(Learning Python一书的合著者以及Python Cookbook一书的编辑)

Reg Charney

Christian Tismer(Stackless Python的创始人)

Jason Stillwell

我在加州大学圣克鲁兹分校的学生献辞

非常感谢我的高中编程老师James P.Prior。

感谢Louise Moser和P.Michael Melliar-Smith(我在加州大学圣巴巴拉分校的研究生论文导师),向两位致以我最深切的感激之情。

感谢Alan Parsons、Eric Woolfson、Andrew Powell、Ian Bairnson、Stuart Elliott、David Paton以及其他项目参与人员,感谢我的 Projectologists 和 Roadkillers 同伴,谢谢你们的音乐、支持和陪伴。

还要感谢我的家人、朋友和上帝,在我过去的疯狂岁月和长途奔袭中,是他们让我保持安全和理智。还要感谢在过去 20 多年以来一直对我深信不疑的人——没有你们,我将无法坚持下来。

最后,还要感谢我的读者以及Python社区。能够教你Python编程,我非常激动,也希望你能在阅读本书的过程中能体验到学习的乐趣。Wesley J.Chun加州硅谷第1部分通用应用主题第1章 正则表达式

有些人在碰到问题时,就想:“我知道,我可以使用正则表达式。”现在,他们就有了两个问题。——Jamie“jwz”Zawinski,1997年8月本章内容:

简介/动机;

特殊符号和字符;

正则表达式和Python语言;

一些正则表达式示例;

更长的正则表达式示例。1.1 简介/动机

操作文本或者数据可是件大事。如果不相信,就仔细看看当今的计算机都在做些什么工作:文字处理、网页表单的填写、来自数据库转储的信息流、股票报价信息、新闻源,而且这个清单还会不断增长。因为我们可能还不知道需要用计算机编程来处理的文本或数据的具体内容,所以能将这些文本或者数据以某种可被计算机识别和处理的模式表达出来是非常有用的。

如果我在运营一个电子邮件存档公司,而作为我的一位客户,你希望查看你自己在去年2 月份发送和接收的所有电子邮件。如果我能够设计一个计算机程序来收集这些信息,然后转发给你,而不是人工阅读你的邮件然后手动处理你的请求,无疑要好很多。因为如果有人看了你的邮件,哪怕只是用眼睛瞄了一下邮件的时间戳,你可能都会对此感到担心(甚至愤怒)。又比如,你可能会认为凡是带有“ILOVEYOU”这样主题的邮件都是已感染病毒的邮件,并要求从你的个人邮箱中删除它们。这就引出了一个问题,即我们如何通过编程使计算机具有在文本中检索某种模式的能力。

正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。简单地说,正则表达式(简称为regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串(见图1-1)。换句话说,它们能够匹配多个字符串……一种只能匹配一个字符串的正则表达式模式是很乏味并且毫无作用的,不是吗?

Python通过标准库中的re模块来支持正则表达式。本节将做一个简短扼要的介绍。限于篇幅,内容将仅涉及Python编程中正则表达式方面的最常见内容。当然,读者对于正则表达式方面的经验(熟悉程度)肯定不同,我们强烈建议阅读一些官方帮助文档和与此主题相关的文档。你将再次会对字符串的理解方式有所改变!核心提示:搜索和匹配的比较

本章通篇会使用搜索和匹配两个术语。当严格讨论与字符串中模式相关的正则表达式时,我们会用术语“匹配”(matching),指的是术语“模式匹配”(pattern-matching)。在Python 术语中,主要有两种方法完成模式匹配:“搜索”(searching),即在字符串任意部分中搜索匹配的模式;而“匹配”(matching)是指判断一个字符串能否从起始处全部或者部分地匹配某个模式。搜索通过search()函数或方法来实现,而匹配通过调用match()函数或方法实现。总之,当涉及模式时,全部使用术语“匹配”;我们按照Python如何完成模式匹配的方式来区分“搜索”和“匹配”。图1-1 可以使用正则表达式来识别有效的Python标识符,例如下面这些:[A-Za-z]\w+的含义是第一个字符是字母,也就是说要么A~Z,要么a~z,后面是至少一个(+)由字母数字组成的字符(\w)。如图所示,可以看到很多字符串被过滤,但是只有那些符合要求的正则表达式模式的字符串被筛选出来。比如“4xZ”被筛选出来,这是因为它是以数字开头的你的第一个正则表达式

前面讲到,正则表达式是包含文本和特殊字符的字符串,该字符串描述一个可以识别各种字符串的模式。我们还简单阐述了正则表达式字母表。对于通用文本,用于正则表达式的字母表是所有大小写字母及数字的集合。可能也存在一些特殊字母;例如,指仅包含字符“0”和“1”的字母表。该字母表可以表示所有二进制字符串的集合,即“0”、“1”、“00”、“01”、“10”、“11”、“100”等。

现在,让我们看看正则表达式的大部分基本内容,虽然正则表达式通常被视为“高级主题”,但是它们其实也非常简单。把标准字母表用于通用文本,我们展示了一些简单的正则表达式以及这些模式所表述的字符串。下面所介绍的正则表达式都是最基本、最普通的。它们仅仅用一个简单的字符串构造成一个匹配字符串的模式:该字符串由正则表达式定义。下面所示为几个正则表达式和它们所匹配的字符串。

上面的第一个正则表达式模式是“foo”。该模式没有使用任何特殊符号去匹配其他符号,而只匹配所描述的内容,所以,能够匹配这个模式的只有包含“foo”的字符串。同理,对于字符串“Python”和“abc123”也一样。正则表达式的强大之处在于引入特殊字符来定义字符集、匹配子组和重复模式。正是由于这些特殊符号,使得正则表达式可以匹配字符串集合,而不仅仅只是某单个字符串。1.2 特殊符号和字符

本节将介绍最常见的特殊符号和字符,即所谓的元字符,正是它给予正则表达式强大的功能和灵活性。表1-1列出了这些最常见的符号和字符。表1-1 常见正则表达式符号和特殊字符(续表)1.2.1 使用择一匹配符号匹配多个正则表达式模式

表示择一匹配的管道符号(|),也就是键盘上的竖线,表示一个“从多个模式中选择其一”的操作。它用于分割不同的正则表达式。例如,在下面的表格中,左边是一些运用择一匹配的模式,右边是左边相应的模式所能够匹配的字符。

有了这个符号,就能够增强正则表达式的灵活性,使得正则表达式能够匹配多个字符串而不仅仅只是一个字符串。择一匹配有时候也称作并(union)或者逻辑或(logical OR)。1.2.2 匹配任意单个字符

点号或者句点(.)符号匹配除了换行符\n以外的任何字符(Python正则表达式有一个编译标记[S或者DOTALL],该标记能够推翻这个限制,使点号能够匹配换行符)。无论字母、数字、空格(并不包括“\n”换行符)、可打印字符、不可打印字符,还是一个符号,使用点号都能够匹配它们。

问:怎样才能匹配句点(dot)或者句号(period)字符?

答:要显式匹配一个句点符号本身,必须使用反斜线转义句点符号的功能,例如“\.”。1.2.3 从字符串起始或者结尾或者单词边界匹配

还有些符号和相关的特殊字符用于在字符串的起始和结尾部分指定用于搜索的模式。如果要匹配字符串的开始位置,就必须使用脱字符(^)或者特殊字符\A(反斜线和大写字母A)。后者主要用于那些没有脱字符的键盘(例如,某些国际键盘)。同样,美元符号($)或者\Z将用于匹配字符串的末尾位置。

使用这些符号的模式与本章描述的其他大多数模式是不同的,因为这些模式指定了位置或方位。之前的“核心提示”记录了匹配(试图在字符串的开始位置进行匹配)和搜索(试图从字符串的任何位置开始匹配)之间的差别。正因如此,下面是一些表示“边界绑定”的正则表达式搜索模式的示例。

再次说明,如果想要逐字匹配这些字符中的任何一个(或者全部),就必须使用反斜线进行转义。例如,如果你想要匹配任何以美元符号结尾的字符串,一个可行的正则表达式方案就是使用模式.*\$$。

特殊字符\b和\B可以用来匹配字符边界。而两者的区别在于\b将用于匹配一个单词的边界,这意味着如果一个模式必须位于单词的起始部分,就不管该单词前面(单词位于字符串中间)是否有任何字符(单词位于行首)。同样,\B将匹配出现在一个单词中间的模式(即,不是单词边界)。下面为一些示例。1.2.4 创建字符集

尽管句点可以用于匹配任意符号,但某些时候,可能想要匹配某些特定字符。正因如此,发明了方括号。该正则表达式能够匹配一对方括号中包含的任何字符。下面为一些示例。

关于[cr][23][dp][o2]这个正则表达式有一点需要说明:如果仅允许“r2d2”或者“c3po”作为有效字符串,就需要更严格限定的正则表达式。因为方括号仅仅表示逻辑或的功能,所以使用方括号并不能实现这一限定要求。唯一的方案就是使用择一匹配,例如, r2d2|c3po。

然而,对于单个字符的正则表达式,使用择一匹配和字符集是等效的。例如,我们以正则表达式“ab”作为开始,该正则表达式只匹配包含字母“a”且后面跟着字母“b”的字符串,如果我们想要匹配一个字母的字符串,例如,要么匹配“a”,要么匹配“b”,就可以使用正则表达式[ab],因为此时字母“a”和字母“b”是相互独立的字符串。我们也可以选择正则表达式a|b。然而,如果我们想要匹配满足模式“ab”后面且跟着“cd”的字符串,我们就不能使用方括号,因为字符集的方法只适用于单字符的情况。这种情况下,唯一的方法就是使用ab|cd,这与刚才提到的r2d2/c3po问题是相同的。1.2.5 限定范围和否定

除了单字符以外,字符集还支持匹配指定的字符范围。方括号中两个符号中间用连字符(-)连接,用于指定一个字符的范围;例如,A-Z、a-z或者0-9分别用于表示大写字母、小写字母和数值数字。这是一个按照字母顺序的范围,所以不能将它们仅仅限定用于字母和十进制数字上。另外,如果脱字符(^)紧跟在左方括号后面,这个符号就表示不匹配给定字符集中的任何一个字符。1.2.6 使用闭包操作符实现存在性和频数匹配

本节介绍最常用的正则表达式符号,即特殊符号*、+和?,所有这些都可以用于匹配一个、多个或者没有出现的字符串模式。星号或者星号操作符(*)将匹配其左边的正则表达式出现零次或者多次的情况(在计算机编程语言和编译原理中,该操作称为Kleene闭包)。加号(+)操作符将匹配一次或者多次出现的正则表达式(也叫做正闭包操作符),问号(?)操作符将匹配零次或者一次出现的正则表达式。

还有大括号操作符({}),里面或者是单个值或者是一对由逗号分隔的值。这将最终精确地匹配前面的正则表达式N次(如果是{N})或者一定范围的次数;例如,{M,N}将匹配M~N次出现。这些符号能够由反斜线符号转义;\*匹配星号,等等。

注意,在之前的表格中曾经多次使用问号(重载),这意味着要么匹配0次,要么匹配1次,或者其他含义:如果问号紧跟在任何使用闭合操作符的匹配后面,它将直接要求正则表达式引擎匹配尽可能少的次数。“尽可能少的次数”是什么意思?当模式匹配使用分组操作符时,正则表达式引擎将试图“吸收”匹配该模式的尽可能多的字符。这通常被叫做贪婪匹配。问号要求正则表达式引擎去“偷懒”,如果可能,就在当前的正则表达式中尽可能少地匹配字符,留下尽可能多的字符给后面的模式(如果存在)。本章末尾将用一个典型的示例来说明非贪婪匹配是很有必要的。现在继续查看闭包操作符。1.2.7 表示字符集的特殊字符

我们还提到有一些特殊字符能够表示字符集。与使用“0-9”这个范围表示十进制数相比,可以简单地使用d表示匹配任何十进制数字。另一个特殊字符(\w)能够用于表示全部字母数字的字符集,相当于[A-Za-z0-9_]的缩写形式,\s可以用来表示空格字符。这些特殊字符的大写版本表示不匹配;例如,\D表示任何非十进制数(与[^0-9]相同),等等。

使用这些缩写,可以表示如下一些更复杂的示例。1.2.8 使用圆括号指定分组

现在,我们已经可以实现匹配某个字符串以及丢弃不匹配的字符串,但有些时候,我们可能会对之前匹配成功的数据更感兴趣。我们不仅想要知道整个字符串是否匹配我们的标准,而且想要知道能否提取任何已经成功匹配的特定字符串或者子字符串。答案是可以,要实现这个目标,只要用一对圆括号包裹任何正则表达式。

当使用正则表达式时,一对圆括号可以实现以下任意一个(或者两个)功能:

对正则表达式进行分组;

匹配子组。

关于为何想要对正则表达式进行分组的一个很好的示例是:当有两个不同的正则表达式而且想用它们来比较同一个字符串时。另一个原因是对正则表达式进行分组可以在整个正则表达式中使用重复操作符(而不是一个单独的字符或者字符集)。

使用圆括号进行分组的一个副作用就是,匹配模式的子字符串可以保存起来供后续使用。这些子组能够被同一次的匹配或者搜索重复调用,或者提取出来用于后续处理。1.3.9节的结尾将给出一些提取子组的示例。

为什么匹配子组这么重要呢?主要原因是在很多时候除了进行匹配操作以外,我们还想要提取所匹配的模式。例如,如果决定匹配模式\w+-\d+,但是想要分别保存第一部分的字母和第二部分的数字,该如何实现?我们可能想要这样做的原因是,对于任何成功的匹配,我们可能想要看到这些匹配正则表达式模式的字符串究竟是什么。

如果为两个子模式都加上圆括号,例如(\w+)-(\d+),然后就能够分别访问每一个匹配子组。我们更倾向于使用子组,这是因为择一匹配通过编写代码来判断是否匹配,然后执行另一个单独的程序(该程序也需要另行创建)来解析整个匹配仅仅用于提取两个部分。为什么不让Python自己实现呢?这是re模块支持的一个特性,所以为什么非要重蹈覆辙呢?1.2.9 扩展表示法

我们还没介绍过的正则表达式的最后一个方面是扩展表示法,它们是以问号开始(?…)。我们不会为此花费太多时间,因为它们通常用于在判断匹配之前提供标记,实现一个前视(或者后视)匹配,或者条件检查。尽管圆括号使用这些符号,但是只有(?P)表述一个分组匹配。所有其他的都没有创建一个分组。然而,你仍然需要知道它们是什么,因为它们可能最适合用于你所需要完成的任务。1.3 正则表达式和Python语言

在了解了关于正则表达式的全部知识后,开始查看 Python 当前如何通过使用 re 模块来支持正则表达式,re模块在古老的Python 1.5版中引入,用于替换那些已过时的regex模块和regsub模块——这两个模块在Python 2.5版中移除,而且此后导入这两个模块中的任意一个都会触发ImportError异常。

re模块支持更强大而且更通用的Perl风格(Perl 5风格)的正则表达式,该模块允许多个线程共享同一个已编译的正则表达式对象,也支持命名子组。1.3.1 re模块:核心函数和方法

表1-2列出了来自re模块的更多常见函数和方法。它们中的大多数函数也与已经编译的正则表达式对象(regex object)和正则匹配对象(regex match object)的方法同名并且具有相同的功能。本节将介绍两个主要的函数/方法——match()和search(),以及compile()函数。下一节将介绍更多的函数,但如果想进一步了解将要介绍或者没有介绍的更多相关信息,请查阅Python的相关文档。表1-2 常见的正则表达式属性① Python 1.5.2版中新增;2.4版中增加flags参数。② Python 2.2版中新增;2.4版中增加flags参数。③ Python 2.7和3.1版中增加flags参数。核心提示:编译正则表达式(编译还是不编译?)

在Core Python Programming或者即将出版的Core Python Language Fundamentals的执行环境章节中,介绍了Python代码最终如何被编译成字节码,然后在解释器上执行。特别是,我们指定eval()或者exec(在2.x版本中或者在3.x版本的exec()中)调用一个代码对象而不是一个字符串,性能上会有明显提升。这是由于对于前者而言,编译过程不会重复执行。换句话说,使用预编译的代码对象比直接使用字符串要快,因为解释器在执行字符串形式的代码前都必须把字符串编译成代码对象。

同样的概念也适用于正则表达式——在模式匹配发生之前,正则表达式模式必须编译成正则表达式对象。由于正则表达式在执行过程中将进行多次比较操作,因此强烈建议使用预编译。而且,既然正则表达式的编译是必需的,那么使用预编译来提升执行性能无疑是明智之举。re.compile()能够提供此功能。

其实模块函数会对已编译的对象进行缓存,所以不是所有使用相同正则表达式模式的 search()和 match()都需要编译。即使这样,你也节省了缓存查询时间,并且不必对于相同的字符串反复进行函数调用。在不同的 Python 版本中,缓存中已编译过的正则表达式对象的数目可能不同,而且没有文档记录。purge()函数能够用于清除这些缓存。1.3.2 使用compile()函数编译正则表达式

后续将扼要介绍的几乎所有的re模块函数都可以作为regex对象的方法。注意,尽管推荐预编译,但它并不是必需的。如果需要编译,就使用编译过的方法;如果不需要编译,就使用函数。幸运的是,不管使用函数还是方法,它们的名字都是相同的(也许你曾对此感到好奇,这就是模块函数和方法的名字相同的原因,例如,search()、match()等)。因为这在大多数示例中省去一个小步骤,所以我们将使用字符串替代。我们仍将会遇到几个预编译代码的对象,这样就可以知道它的过程是怎么回事。

对于一些特别的正则表达式编译,可选的标记可能以参数的形式给出,这些标记允许不区分大小写的匹配,使用系统的本地化设置来匹配字母数字,等等。请参考表1-2中的条目以及在正式的官方文档中查询关于这些标记(re.IGNORECASE、re.MULTILINE、re.DOTALL、re.VERBOSE等)的更多信息。它们可以通过按位或操作符(|)合并。

这些标记也可以作为参数适用于大多数 re 模块函数。如果想要在方法中使用这些标记,它们必须已经集成到已编译的正则表达式对象之中,或者需要使用直接嵌入到正则表达式本身的(?F)标记,其中F是一个或者多个i(用于re.I/IGNORECASE)、m(用于re.M/MULTILINE)、s(用于re.S/DOTALL)等。如果想要同时使用多个,就把它们放在一起而不是使用按位或操作,例如,(?im)可以用于同时表示re.IGNORECASE和re.MULTILINE。1.3.3 匹配对象以及group()和groups()方法

当处理正则表达式时,除了正则表达式对象之外,还有另一个对象类型:匹配对象。这些是成功调用 match()或者 search()返回的对象。匹配对象有两个主要的方法:group()和groups()。

group()要么返回整个匹配对象,要么根据要求返回特定子组。groups()则仅返回一个包含唯一或者全部子组的元组。如果没有子组的要求,那么当group()仍然返回整个匹配时,groups()返回一个空元组。

Python正则表达式也允许命名匹配,这部分内容超出了本节的范围。建议读者查阅完整的re模块文档,里面有这里省略掉的关于这些高级主题的详细内容。1.3.4 使用match()方法匹配字符串

match()是将要介绍的第一个re模块函数和正则表达式对象(regex object)方法。match()函数试图从字符串的起始部分对模式进行匹配。如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回 None,匹配对象的 group()方法能够用于显示那个成功的匹配。下面是如何运用match()(以及group())的一个示例:

>>> m = re.match('foo', 'foo')  # 模式匹配字符串

>>> if m is not None:     # 如果匹配成功,就输出匹配内容

...   m.group()

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?