登录

  • 登录
  • 忘记密码?点击找回

注册

  • 获取手机验证码 60
  • 注册

找回密码

  • 获取手机验证码60
  • 找回
毕业论文网 > 外文翻译 > 电子信息类 > 信息工程 > 正文

基于python网络爬虫技术的气象数据收集与分析外文翻译资料

 2022-12-02 19:31:39  

英语原文共 886 页,剩余内容已隐藏,支付完成后下载完整资料


翻译文献:Python(第3版)核心编程

内容提要:

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

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

第1章 正则表达式

有些人在碰到问题时,就想:“我知道,我可以使用正则表达式。”现在,他们就有了两 个问题。

—Jamie“jwz”Zawinski,1997年8月

本章内容:

bull; 简介/动机;

bull; 特殊符号和字符;

bull; 正则表达式和 Python 语言;

bull; 一些正则表达式示例;

bull; 更长的正则表达式示例

1.1 简介/动机

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

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

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

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

核心提示:搜索和匹配的比较

本章通篇会使用搜索和匹配两个术语。当严格讨论与字符串中模式相关的正则表达式 时,我们会用术语“匹配”(matching),指的是术语“模式匹配”(pattern-matching)。在 Python 术语中,主要有两种方法完成模式匹配:“搜索”(searching),即在字符串任意部 分中搜索匹配的模式;而“匹配”(matching)是指判断一个字符串能否从起始处全部或者 部分地匹配某个模式。搜索通过 search()函数或方法来实现,而匹配通过调用 match()函数 或方法实现。总之,当涉及模式时,全部使用术语“匹配”;我们按照 Python 如何完成模 式匹配的方式来区分“搜索”和“匹配”。

你的第一个正则表达式

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

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

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

1.2 特殊符号和字符

本节将介绍最常见的特殊符号和字符,即所谓的元字符,正是它给予正则表达式强大的 功能和灵活性。表 1-1 列出了这些最常见的符号和字符。

1.2.1 使用择一匹配符号匹配多个正则表达式模式

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

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

1.2.2 匹配任意单个字符

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

1.2.3 从字符串起始或者结尾或者单词边界匹配

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

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

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

特殊字符 和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 使用圆括号指定分组

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

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

bull; 对正则表达式进行分组;

bull; 匹配子组。

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

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

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

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

1.2.9 扩展表示法

我们还没

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[21732],资料为PDF文档或Word文档,PDF文档可免费转换为Word

您需要先支付 30元 才能查看全部内容!立即支付

企业微信

Copyright © 2010-2022 毕业论文网 站点地图