Python核心编程(第3版)
第1 部分 通用应用主题

第1章 正则表达式

章节主张:第1章真正建立的是“文本规则化”能力:把看似杂乱的字符串变成可匹配、可抽取、可替换的结构对象。

中文释读:如果把 Python 看成自动化的胶水语言,那么正则表达式就是第一套文本级扳手。本章不是为了炫技地写复杂模式,而是为了帮你建立“模式、边界、匹配对象、替换流程”这一整套心智模型。

章节知识路线

  1. 1.1 简介/动机
  2. 1.2 特殊符号和字符
  3. 1.3 正则表达式和Python语言
  4. 1.4 一些正则表达式示例
  5. 1.5 更长的正则表达式示例

关键论点

  • 特殊字符和字符集决定表达力。
  • `re` 模块把模式从字符串变成可编程对象。
  • 长正则示例提醒你:可维护性和可读性比一次写完更重要。

行动清单

  • 为常用模式建一个个人片段库。
  • 区分 `match`、`search`、`findall` 的使用场景。
  • 对真实文本先做最小样本测试。

源章节深读

1.1 简介/动机

解决的问题:这一节解决的是“1.1 简介/动机在真实应用里到底扮演什么角色”。

第 1 章 正则表达式 3 1.1 简介/动机 操作文本或者数据可是件大事。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 1.1 简介/动机 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

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

1.2 特殊符号和字符

解决的问题:这一节解决的是“1.2 特殊符号和字符在真实应用里到底扮演什么角色”。

第 1 章 正则表达式 5 达式以及这些模式所表述的字符串。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 1.2 特殊符号和字符 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 1 章 正则表达式 5 达式以及这些模式所表述的字符串。 下面所介绍的正则表达式都是最基本、最普通的。 它们 仅仅用一个简单的字符串构造成一个匹配字符串的模式:该字符串由正则表达式定义。

1.3 正则表达式和Python语言

解决的问题:这一节解决的是“1.3 正则表达式和Python语言在真实应用里到底扮演什么角色”。

第 1 章 正则表达式 11 执行另一个单独的程序(该程序也需要另行创建)来解析整个匹配仅仅用于提取两个部 分。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 1.3 正则表达式和Python语言 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 1 章 正则表达式 11 执行另一个单独的程序(该程序也需要另行创建)来解析整个匹配仅仅用于提取两个部 分。 为什么不让 Python 自己实现呢? 这是 re 模块支持的一个特性,所以为什么非要重蹈 覆辙呢?

1.4 一些正则表达式示例

解决的问题:这一节解决的是“1.4 一些正则表达式示例在真实应用里到底扮演什么角色”。

28 第 1 部分 通用应用主题 核心提示:使用 Python 原始字符串 读者可能在之前的一些示例中见过原始字符串的使用。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 1.4 一些正则表达式示例 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

28 第 1 部分 通用应用主题 核心提示:使用 Python 原始字符串 读者可能在之前的一些示例中见过原始字符串的使用。 正则表达式对于探索原始字符 串有着强大的动力,原因就在于 ASCII 字符和正则表达式的特殊字符之间存在冲突。 作为 一个特殊符号, \b 表示 ASCII 字符的退格符,但是\b 同时也是一个正则表达式的特殊符号, 表示匹配一个单词的边界。

1.5 更长的正则表达式示例

解决的问题:这一节解决的是“1.5 更长的正则表达式示例在真实应用里到底扮演什么角色”。

第 1 章 正则表达式 33 Python 2 版本下 retasklist.py 的最终版本。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 1.5 更长的正则表达式示例 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 1 章 正则表达式 33 Python 2 版本下 retasklist.py 的最终版本。 示例 1-4 处理 DOS 环境下 tasklist 命令的输出(retasklist.py) 这里的脚本使用一个正则表达式和 findall()来解析 DOS环境下 tasklist命令的输出,但是仅仅显示感兴趣的 数据。 将该脚本移植到 Python 3时,仅仅需要修改 print()函数。

1.6 练习

解决的问题:这一节解决的是“1.6 练习在真实应用里到底扮演什么角色”。

第 1 章 正则表达式 39 放在一起,以使用 gendata.py 作为开始! 最后一个示例:假定我们仅想取出三个整数字段中间的那个整数。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 1.6 练习 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 1 章 正则表达式 39 放在一起,以使用 gendata.py 作为开始! 最后一个示例:假定我们仅想取出三个整数字段中间的那个整数。 如下所示,这就是实现的 方法(使用一个搜索,这样就不必匹配整个字符串):-(\d+)-。 >>> patt = '-(\d+)- ' >>> m = re.search(patt, data) >>> m.group() # entire match ' -6- ' >>> m.group(1) # subgroup 1 '6' 本章几乎没有涉及正则表达式的强大功能,在有限的篇幅里面我们不可能做到。

辨别题

什么时候不应该继续给正则加功能,而应该改用结构化解析?

本章图版学习路径

全书能力地图

1.1 简介/动机

核心 `re` 模块